指定されたすべてのテキストファイルを収集し、名前を変更してフォルダにコピーするコマンド

指定されたすべてのテキストファイルを収集し、名前を変更してフォルダにコピーするコマンド

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次のコマンドを使用できます。

関連情報