以下は、絶対にどのパスでも機能するはずです。
head
を使えるように関数を宣言する そして tail
NUL 区切りの出力:
nul_terminated() {
tr '\0\n' '\n\0' | "[email protected]" | tr '\0\n' '\n\0'
}
次に、それを使用して、tail
を通過した後、検索から NUL で区切られたパスのリストを取得できます。 :
find . -exec printf '%s\0' {} \; | nul_terminated tail -n 2
それを xargs
にパイプすることができます オプションを追加します:
find . -iname "*FooBar*" -exec printf '%s\0' {} \; | nul_terminated tail -n 2 | xargs -I "{}" -0 cp "{}" "dest"
説明:
<オール>find
現在のディレクトリ内のファイル (.
) 以下の foobar
を含む名前 (i
のため、大文字と小文字は区別されません) -iname
で );-exec
) コマンド{}
) に続く NUL 文字 (\0
) 個別に (\;
);tr '\0\n' '\n\0'
);"tail -n 2
) を取得します。 、 "[email protected]"
);tr '\0\n' '\n\0'
).
xargs
コマンドは説明が少し難しいです。 cp ... "dest"
もの数をビルドします 最大コマンド長に収まるように必要なコマンド オペレーティング システムの {}
を置き換えます コマンド内のトークンと実際のファイル名 (-I "{}" ... "{}"
)、パラメーターを読み取るときに区切り文字として NUL 文字を使用します (-0
).
試すことができます
cp $(find . -iname "*FooBar*" | tail -2 ) dest
find . -iname "*FooBar*"|tail -n2|xargs -i cp "{}" dest
残念ながら、これはスペースや改行を含むファイル名では機能しません。