execを使用した検索とコピーは機能しません。

execを使用した検索とコピーは機能しません。

次のコマンドを使用して、ディレクトリ内の最新のファイルをインポートします。

/usr/bin/find /home/user1/folder1/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | cut -f5 -d"/"

これはフルパスではなくファイル名のみを返します。

その後、見つかったファイルを別のフォルダにコピーしたいので、以前のfindコマンドに次のものを追加しました。

 -exec cp {} /home/user2/folder2 \;

したがって、完全なコマンドは次のようになります。

 /usr/bin/find /home/user1/folder1/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | cut -f5 -d"/ -exec cp {} /home/user2/folder2 \;

しかし、これは戻ります

cut: invalid option -- 'e'

私がここで何を間違っているのか?

ベストアンサー1

あなたのコマンドには2つの問題があるようです。そのうちの最初のものはあなたの場合には重要ではないかもしれませんが、まだ指摘する価値があります。(私)\n任意のファイル名、特に改行文字を含むファイル名(たとえば)を処理できないため、普遍的ではありません。(二)Kusalanandaがすでに指摘しているように、オプション-execはコマンドに属しているので、findあなたがしたいようにオプションから切り離すことはできません。

GNUユーティリティを使用すると、次のパイプラインでこれらの問題を解決できます。このパイプラインは、ディレクトリ(または下)から最新のファイルを見つけて、次の/home/user1/folder1/場所にコピーします/home/user2/folder2/

find /home/user1/folder1/ -type f -printf '%T@ %p\0' 2>/dev/null |
sort -znk1,1 | tail -zn1 | cut -zf2- -d' '                       |
xargs -0 cp -t /home/user2/folder2/

問題に関しては(私):フォーマット文字列\0の末尾にあり、オプションと-printfパイプラインのさまざまなコマンドに注意してください-z。このコマンドは、認識されたファイル名をNULで区切って渡し、スペースや改行を含めることができます。-0

問題に関しては(二):このxargsコマンドを使用してパラメータを収集し、stdinそれを使用して新しいコマンドラインを作成できます。ここでの秘密の1つは、コピーするファイル名を指定する前に、コマンドの-tオプションを使用してcpターゲットディレクトリを指定することです。なぜなら、xargsコマンドラインは次のように構成されるからです。追加stdin与えられたコマンドに対して受け取るすべての引数です。

おすすめ記事