次のコマンドを使用して、ディレクトリ内の最新のファイルをインポートします。
/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
与えられたコマンドに対して受け取るすべての引数です。