ファイルの検索とコピーの代替案をお探しですか?

ファイルの検索とコピーの代替案をお探しですか?

themes.txtさまざまなフォルダに名前が異なりますが、内容の異なるファイルがたくさん散在して​​います。

locate(!!!ではありません)コマンドを使用してfind検索し、cp -backupコマンドを使用して名前付きフォルダにコピーしたいと思います/home/myhome/1

Linux Mint 20.3では可能ですか?そうでない場合、代替ソリューションはありますか?

答え1

オプション(NULで区切られた出力用)と(ファイルがまだ存在することを確認するための追加チェック)をlocateサポートし、GNUとandのサポートがある場合(すべてLinux Mintの場合に該当する必要があります):-0-ecpsortxargs-r-0

LC_ALL=C locate -0e '*/themes.txt' |
  LC_ALL=C sort -zV |
  xargs -r0 cp -t ~/1 --backup=numbered

これはsort -V、ファイルがコピーされるランダムではない順序(ここではバージョン順)を取得するためのものであり、これは必要ありません。

呼び出された正確なファイルをlocate -0e '*/themes.txt'検索するには、これを行うこともできます。実装がはるかに高速であることがわかりました(代わりに使用できると手動で言及されていますが、少なくとも実装では機能しません)。themes.txtlocate -0be '[t]hemes.txt'mlocatemlocate\themes.txt'[t]hemes.txtplocate

答え2

 cp --backup=numbered $(locate themes.txt) /home/myhome/1

答え3

IMHO、locate出力を解析する必要があるすべての操作の場合は、findシェルループを使用するのが最善です。これは、部分的にはUnixファイル名の属性(改行文字を含めることができる)によるものであり、部分的には使用されたlocateデータベースが古くなっている可能性があるためです。

findandを使用せずにlocateこれを行うことができますbash

shopt -s globstar
shopt -s nullglob dotglob

for pathname in ./**/themes.txt; do
    cp -b "$pathname" ~/1/
done

**これにより、最初にパス名内で一致する/(したがってサブディレクトリに「繰り返し」)、一致するワイルドカードパターンを使用できます。その後、nullglob一致しないパターンを削除し、隠されたdotglob名前のパターン一致を許可できます。

このループは、移動したいすべての名前を繰り返して現在のディレクトリまたはサブディレクトリで一致させ、各名前cp -b(同じ)を-bホームディレクトリの下に--backup呼び出されたディレクトリにコピーします。1

これは、現在のディレクトリがホームディレクトリではないと仮定します。これは、ターゲットディレクトリのファイルが含まれるためです。

これらのファイルのほんの一部しかないことがわかっている場合は、themes.txt次のコマンドを使用できます。

shopt -s globstar dotglob failglob
cp -b -t ~/1/ ./**/themes.txt

in を使用すると、一致する名前がないとfailglobコマンドは正常に失敗します(パターンが名前と一致しない場合、シェルはコマンドを実行しようともしません)。nullglob

上記のコマンドは、一致する名前が実際に通常のファイルであるかどうかをテストしません(ディレクトリ、シンボリックリンク、または他の非正規ファイルである可能性があります)。これには、次のものを使用できます。

shopt -s globstar
shopt -s nullglob dotglob

for pathname in ./**/themes.txt; do
    if [ -f "$pathname" ] && [ ! -L "$pathname" ]; then
        cp -b "$pathname" ~/1/
    fi
done

これは通常のファイルのみをコピーし、非正規ファイルと一般ファイルへのシンボリックリンクを防ぎます。


それでfindあなたはしなければなりません

find . -name themes.txt -type f -exec cp -b -t ~/1/ {} +

つまり、現在のディレクトリまたは次のディレクトリのどこからでも、できるだけ多くの一般的なファイルをcp -b -t ~/1/一度に呼び出します。themes.txtこれの利点は、cp通話回数をできるだけ減らすことができることです。

関連情報