我试图递归地复制包含.csv
扩展名的文件的文件夹,并在将它们复制到单个文件夹时重命名它们。
除了文件重命名使我难以捉摸之外,我已经关闭了。
有人可以协助吗?
find "/IMPORTS/EFHG2" -iname '*.csv*' -exec cp {} /temp/Template \;
至于重命名,我正在寻找可以对文件来源的父文件夹有所指示的东西。
file1.csv
,file2.csv
)dir1.file1.csv
,dir2.file1.csv
)具有以下结构:
├── 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
命令找到的最新文件覆盖,这就是为什么我使用-n
该cp
命令来阻止该操作,因此不会复制相同的文件,注意到这一点。
解释:
find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '...' sh_cp {} \;
.csv
递归查找后缀为(ignore-case)的文件,并为我们命名的每个文件内联-exec
脚本ute ;这是find命令找到它的文件路径的替换,然后传递给脚本,可以在或参数上对其进行访问。sh
sh -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] 删除。
我来说两句