使用文件夹名称的一部分作为新名称递归复制和重命名文件

使用文件夹名称的一部分作为新名称递归复制和重命名文件

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

除了我无法理解的文件重命名之外,我已经很接近了。

有人可以帮忙吗?

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

至于重命名,我正在寻找能够提供文件来源父文件夹的一些指示的内容。

  • 原来的 (file1.csvfile2.csv
  • 修改的 (dir1.file1.csvdir2.file1.csv

答案1

具有以下结构:

├── 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递归地查找带有后缀(忽略大小写)的文件,并为每个我们命名的-exec文件使用内联脚本;这shsh -c '...'sh_cp{}是 的替代文件路径find 命令找到它,然后我们传递给我们的脚本,并且可以通过$1${1}参数访问它。

  • ${1%/*}:从参数中删除最短后缀${1}(已知Shell 参数扩展),正如上面所说的${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

相关内容