「week1」というフォルダーがあり、そのフォルダーには、「submit.pdf」という名前のファイルを含む複数のファイルを含む約 10 個のフォルダーがあります。すべての「submit.pdf」ファイルを 1 つのフォルダーにコピーできるようにしたいと考えています。理想的には、ターミナルを使用してプロセスを迅速化します。cp week1/*/submit.pdf week1/と同様に試してみましcp week1/*/*.pdf week1/たが、最終的に 1 つのファイルをコピーするだけでした。毎回各ファイルを上書きしていることに気付きました。そのため、1つのファイルで立ち往生しています...とにかく、それが起こらないようにすることはできますか?
2 に答える
OSを指定する必要はありませんが、Gnucpを使用cp week1/*/submit.pdf --backup=t week/している場合は、既存のファイルに(任意に)番号を付けるために使用できます。しかし、それでは、どれがどれであるかを識別する実際の方法は得られません。
おそらく、次のようなことを行うことができます。
for file in week1/*/submit.pdf; do cp "$file" "${file//\//-}"; done
…「week1-subdir-submit.pdf」のような名前のファイルを生成します
価値のあるものとして、"${var/s/r}"表記はvarを取ることを意味しますが、その値を挿入する前に、s(\/、は、その式/の他の特殊な理由でエスケープされた)を検索し、 r( )に/置き換えて、一意のファイル名を作成します。-
編集:実際にはもう1つ /あり、複数回一致させるために、構文を作成します。
"${ var / / \/ / - }"
take "var" replace every instance of / with -
find救助へ!経験則: で必要なファイルを一覧表示できる場合はfind、それらをコピーできます。だから最初にこれを試してください:
$ cd your_folder
$ find . -type f -iname 'submit.pdf'
いくつかのメモ:
find .「現在のディレクトリから検索を開始する」ことを意味します-type -f「通常のファイルのみを検索する」ことを意味します (つまり、ディレクトリは検索しません)。-iname 'submit.pdf'「...大文字と小文字を区別しない名前「submit.dpf」」。を使用する必要はありませんが'quotation'、ワイルドカードを使用して検索する場合は使用する必要があります。例えば:~ foo$ find /usr/lib -iname '*.So*' /usr/lib/pam/pam_deny.so.2 /usr/lib/pam/pam_env.so.2 /usr/lib/pam/pam_group.so.2 ...
大文字と小文字を区別して検索する場合は、-name代わりに-iname.
これが機能する場合、コマンドを使用して各ファイルをコピーできます-exec。 execヒット時に使用するコマンドを指定できるようにすることで機能します。findファイルが見つかるたびにコマンドを実行し、ファイルの名前を{}. を指定して一連のコマンドを終了します\;。
したがって、echoすべてのファイルに対して、次のようにします。
$ find . -type f -iname submit.pdf -exec echo Found file {} \;
それらを 1 つずつコピーするには、次のようにします。
$ find . -type f -iname submit.pdf -exec cp {} /destination/folder \;
お役に立てれば!