file.txtという名前のテキストファイルが何千ものあります。すべて同じ名前を共有しているため、上書きしないと同じフォルダに移動できません。
何千ものディレクトリとサブディレクトリからすべてのfile.txtファイルを見つけて、ファイル名の末尾にフルパス名を追加してから、元のフォルダの場所をそのままにして指定されたフォルダにコピーするコマンドが必要です。
例:
from: file.txt
to: a/123/file.txt
(ファイル名に/を使用できないことがわかっているので、視覚的に適切な置換がないとハイフンやアンダースコアが機能します)
また、一部はfile.txt、一部はFile.txt、最後にオプションの「S」があるため、コマンドは大文字と小文字を無視する必要があります(file.txtまたはfiles.txt)。
名前の変更中にディレクトリ/サブディレクトリ名がランダムなので、大文字と小文字を変更せずにパスをそのまま追加したいです(例:a / adgDGeRddsdvvsdGSD / [fF] ile [s].txt
ありがとうございます!
ベストアンサー1
シェルスクリプトを使用してfind
パスを起動ディレクトリへの相対パスに変換し、次のよう/
に置き換えます_
。
find . -type f -iname 'file*.txt' -exec sh -c '
targetdir=$1; shift
for file; do
cp "$file" "$targetdir/$(realpath --relative-base=. "$file" | tr '/' '_')"
# uncomment to restrict the filename to the last 4 directories
#cp "$file" "$targetdir/$(realpath --relative-base=. "$file" |
# rev | cut -d'/' -f-5 | rev | tr '/' '_')"
done
' sh /tmp/dest {} +
コマンドを実行する前に、ターゲット/tmp/dest
ディレクトリとcd
ファイルの親ディレクトリに置き換えてください。
入力ディレクトリ構造の例:
.
├── dir1
│ ├── file.txt
│ └── sub1
│ └── file.txt
├── dir2
│ └── file.txt
└── file.txt
出力/tmp/dest
:
dir1_file.txt
dir1_sub1_file.txt
dir2_file.txt
file.txt