将多个文件夹中的多个文件复制到一个文件夹中

将多个文件夹中的多个文件复制到一个文件夹中

如何将多个文件夹中的多个文件复制到一个文件夹中,并根据复制的目录更改它们的名称?

初始目录层次结构:

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、prenameRHEL/CentOS、IIRC 上):

folder1在, folder2,的父级中folder3

rename -n s:/:_: */*

-n是“试运行”参数,如果重命名看起来不错,则用“-v”替换或删除。

基本上,这会将文件从当前目录移动directory/filedirectory_file当前目录。如果您有多个文件夹级别并且正在使用 bash,则可以使用

shopt -s globstar   # Possibly already set, necessary for the "**"
rename -n s:/:_:g **/*

这会将文件从当前目录移动some/path/to/filesome_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//\//_}将“/”替换为下划线。

相关内容