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
答え2
私はそうします:
while read -r file; do mv $file /path/to/dir/$(echo $file | tr '/' '_'); done < <(find / -name *.txt -type f 2>/dev/null)
これにより、コマンドのすべての結果が繰り返され、目的のfind
ディレクトリに移動されます。
コピーするには、cp
次のコマンドを使用できます。