如何将多个文件夹中的多个文件复制到一个文件夹中,并根据复制的目录更改它们的名称?
初始目录层次结构:
folder1/
file1.gz
filexyz.gz
folder2/
file1.gz
filexyz.gz
folder3/
file1.gz
filexyz.gz
结果:
folder1_file1.gz
folder2_file1.gz
folder3_file1.gz
folder1_filexyz.gz
folder2_filexyz.gz
folder3_filexyz.gz
答案1
使用简单的 shell 循环,假设文件应复制到值给定的目录$destdir
:
for pathname in */*.gz; do
cp -i -- "$pathname" "$destdir/$( dirname -- "$pathname" )_$( basename -- "$pathname" )"
done
答案2
使用预命名/重命名(又名 Larry Wall 的 Perl 重命名)(rename
在 Debian/Ubuntu、prename
RHEL/CentOS、IIRC 上):
folder1
在, folder2
,的父级中folder3
:
rename -n s:/:_: */*
-n
是“试运行”参数,如果重命名看起来不错,则用“-v”替换或删除。
基本上,这会将文件从当前目录移动directory/file
到directory_file
当前目录。如果您有多个文件夹级别并且正在使用 bash,则可以使用
shopt -s globstar # Possibly already set, necessary for the "**"
rename -n s:/:_:g **/*
这会将文件从当前目录移动some/path/to/file
到some_path_to_file
当前目录。
答案3
像这样的东西吗?
#!/bin/bash -ex
DESTDIR="PATH/TO/FINAL/DESTINATION/DIRECTORY"
for DIRS in /PATH/TO/YOUR/DIRECTORIES/*/;
do
for FLES in $DIRS*.gz;
do
cp $FLES $DESTDIR/$(echo $(basename $DIRS)"_"$(basename $FLES))
done
done
编辑:我懒得在代码中添加任何解释,因为OP没有费心去表明他们已经尝试自己解决问题(如果有的话)。但无论如何,我们都应该提供帮助,因此我才发表这篇文章。
答案4
尝试这个,
find folder[1-3] -type f -name '*.gz' | while read -r FILE; do cp "$FILE" "${FILE//\//_}"; done
folder[1-3]
源位置。-type f
仅搜索文件。-name '*.gz'
文件名后缀为.gz
.${FILE//\//_}
将“/”替换为下划线。