複数のフォルダの複数のファイルを1つのフォルダにコピー

複数のフォルダの複数のファイルを1つのフォルダにコピー

複数のフォルダ内の複数のファイルを1つのフォルダにコピーし、コピーされたディレクトリに基づいて名前を変更する方法は?

初期ディレクトリ階層:

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

単純なシェルループを使用して、ファイルを値で指定されたディレクトリにコピーする必要があるとします$destdir

for pathname in */*.gz; do
    cp -i -- "$pathname" "$destdir/$( dirname -- "$pathname" )_$( basename -- "$pathname" )"
done

答え2

辞書名/名前変更(Larry WallのPerl名前変更とも呼ばれます)を使用(renameDebian / Ubuntu、prenameRHEL / 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//\//_}「/」を下線にしてください。

関連情報