GNU/Linux >> Linux の 問題 >  >> Linux

find -exec でベース名とフル パスの両方を使用する

このようなことを試してください:

find  /home/mine -iname "*.png" -printf "%P\n " | xargs  -I % -n1 cp %  /home/mine/pngcoppies/copy% 

検索を実行したときに何が起こっているかを確認するには、02 と入力します。
-x :コマンドとその引数を実行時に出力します。
-v :読み込まれたシェル入力行を出力します。

これが私が持っているものです:

find . -name "*.xml" -exec echo {} \;

出力を与える:

./log.xml
./svnLog.xml

そして、私が試してみると:

set -xv
find . -name "*.xml" -exec echo {} \;

私は得る:

find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml

そして、リテラルの代わりに見つかったファイル名を渡す実行エコーを見つけます: 15

しかし、 21 に何かを追加すると 以下のように:

find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}

ここで、私が持っている 2 つの xml ファイルに対してエコーが 2 回実行されます。 exec のパラメータ リストであり、置き換えられることはありません。 42 を取得しました 見つかった各ファイルに対して。

これに対処するには、次のようにファイル名をパラメーターとして渡して echo を実行することを考えることができます:

sh -xvc 'echo sothing/$0' filename

53 が何であるかはすでにわかっています そして 68 . 76 その後の文字列からコマンドを取得することです(85 )

結果は :

sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename

'94 を使用しました $0 が現在のシェルによって展開されないようにします。 " " で試してみると、$0 の拡張が表示されます;)

したがって、「問題」に戻るには、検索結果を次のようにフォーマットする必要があります:

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;

そして、次のようになります:

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
+ find . -name '*.xml' -exec sh -xvc 'echo sothing/$0' '{}' ';'
echo sothing/$0
+ echo sothing/./log.xml
sothing/./log.xml
echo sothing/$0
+ echo sothing/./svnLog.xml
sothing/./svnLog.xml

ご覧のとおり、find はシェルのコマンド 107 を実行します。 それに 117 を渡します (find で見つかったファイル名に置き換えられます) したがって、目的の 121 が得られます

135 詳細モードを削除すると、次のようになります:

find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml

したがって、あなたの場合、サブシェルでコピーを実行するだけです( 140 を追加します または 151 または、exec の後に shell を使用する) と let 161 ファイル名をパラメーターとして it に渡します;)

find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;

これが役に立てば幸いです。私の英語について失礼します。


man find から:「-execdir プライマリは、ユーティリティが現在のファイルを保持するディレクトリから実行されることを除いて、-exec プライマリと同じです。文字列 ``{}'' に置き換えられたファイル名は修飾されていません。」

find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;

Linux
  1. Linuxでsedを使用してテキストファイルを検索および置換する

  2. 「sed」を使用して検索して置換しますか?

  3. grep と sed を使用して文字列を検索して置換する

  1. Linux で find コマンドを使用して、スペースのあるファイルを検索して削除する

  2. LinuxでHADOOP_HOMEパスを見つける方法は?

  3. sedを使用して、ファイル内の行の範囲内のテキストを検索して置換します

  1. Bash を使用してファイルを検索してコピーする

  2. Windows と Linux の両方を使用する場合、どのファイルシステムを使用すればよいですか?

  3. 名前と部分パスでファイルを検索するにはどうすればよいですか?