
複数のフォルダ内の複数のファイルを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名前変更とも呼ばれます)を使用(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//\//_}
「/」を下線にしてください。