使用部分文件夹名称作为新名称以递归方式复制和重命名文件

用户445836

我试图递归地复制包含.csv扩展名的文件的文件夹,并在将它们复制到单个文件夹时重命名它们。

除了文件重命名使我难以捉摸之外,我已经关闭了。

有人可以协助吗?

find "/IMPORTS/EFHG2" -iname '*.csv*' -exec cp {} /temp/Template \;

至于重命名,我正在寻找可以对文件来源的父文件夹有所指示的东西。

  • 原始(file1.csvfile2.csv
  • 已修改(dir1.file1.csvdir2.file1.csv
αғsнιη

具有以下结构:

├── destdir
└── srcdir
    ├── dir1
    │   └── with space.csv
    ├── dir2
    │   └── infile.csv
    └── dir3
        └── otherfile.Csv

运行命令:

find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    echo cp -nv "${1}" "/path/to/destdir/${path##*/}.${filename}" ' sh_cp {} \;

将产生以下输出(以干模式运行):

cp -v /path/to/srcdir/dir2/infile.csv     /path/to/destdir/dir2.infile.csv
cp -v /path/to/srcdir/dir1/with space.csv /path/to/destdir/dir1.file with space.csv
cp -v /path/to/srcdir/dir3/otherfile.Csv  /path/to/destdir/dir3.otherfile.Csv

如果我们删除命令(用于空运行)echo前面的cp以获得复制和重命名效果,您将获得以下结构:

├── destdir
│   ├── dir1.with space.csv
│   ├── dir2.infile.csv
│   └── dir3.otherfile.Csv
└── srcdir
    ├── dir1
    │   └── with space.csv
    ├── dir2
    │   └── infile.csv
    └── dir3
        └── otherfile.Csv

请注意,如果子目录中有相同的文件名和相同的父目录名称,它将被find命令找到的最新文件覆盖,这就是为什么我使用-ncp命令来阻止该操作,因此不会复制相同的文件,注意到这一点。


解释:

find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '...' sh_cp {} \;

.csv递归查找后缀为(ignore-case)的文件,我们命名的每个文件内联-exec脚本ute find命令找到它的文件路径的替换,然后传递给脚本,可以在参数上对其进行访问shsh -c '...'sh_cp{}$1${1}

  • ${1%/*}:从${1}参数(称为Shell-Parameter-Expansion)中删除最短的后缀,因为上面说的${1}文件路径,并使用它文件路径中删除文件名+最后一个/仅保留路径并存储在变量中。path

    ${1}      --> /path/to/srcdir/dir2/infile.csv
    ${1%/*}   --> /path/to/srcdir/dir2
    
  • ${1##*/}:从${1}参数中删除最长前缀这个我们删除路径文件路径,并只保留文件名和保存的filename变量。

    ${1}      --> /path/to/srcdir/dir2/infile.csv
    ${1##*/}  --> infile.csv
    

    和协议:

    path                    --> /path/to/srcdir/dir2
    ${path##*/}             --> dir2
    ${filename}             --> infile.csv
    ${path##*/}.${filename} --> dir2.infile.csv
    

尖端:

xYz='to-test/path/to/srcdir/dir2/infile.csv'
${xYz%/*}   --> to-test/path/to/srcdir/dir2
${xYz%%/*}  --> to-test
${xYz#*/}   --> path/to/srcdir/dir2/infile.csv
${xYz#*/}   --> infile.csv

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用ReadDirectoryChangesW C重命名文件夹后获取旧名称和新名称

重命名,根据新名称创建文件夹

递归搜索,将jpg文件复制并重命名为父文件夹名称

重命名 pdf 文件以包含父文件夹名称作为前缀,并包含唯一后缀

AWS Athena:使用“文件夹”名称作为分区

将文件从子文件夹复制到父文件夹并使用父文件夹名称重命名文件

如何在python中逐行使用文本文件的新名称重命名文件夹中的文件名

使用父文件夹的名称重命名子文件夹中的文件

Bash:使用文件夹名称重命名文件(每个文件夹 1 个)

FastAPI 说缺少文件夹名称作为模块

使用文件夹名称重命名文件夹中的所有图像

遍历文件夹并使用文件夹名称顺序重命名每个文件夹中的所有文件

重命名同一文件夹中的图像(新名称+图像大小)时出现问题

如何在URL中使用不同的名称作为Area而不重命名文件

使用新名称输入移动和重命名文件的命令行

重命名文件并添加其父文件夹名称

根据文件夹名称重命名文件

根据文件夹名称重命名文件

通过文件夹名称重命名文件

使用 PowerShell 重命名目录和子文件夹中具有给定名称的批量文件

使用 Powershell 重命名当前目录中包含文件和子目录的所有文件夹名称

使用文件夹名称和序列号批量重命名文件-发送到菜单

重命名Fedora中的文件夹名称

批量重命名文件夹名称中的特定文本

使用 bash `find` 使用文件夹名称重命名文件

使用Excel中的名称映射,使用Python重命名文件夹中的文件

批处理文件-根据父名称和(子)文件夹名称重命名文件

根据部分文件夹名称增加文件夹名称

在文件夹,子文件夹和多个文件中递归查找和重命名