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与えられたコマンドに対して受け取るすべての引数です。

答え2

シェルを使用して、zsh最近変更されたファイルをディレクトリにコピーするとします/home/user1/folder1

cp /home/user1/folder1/*(.om[1]) /home/user2/folder2

zsh対話型シェルでない場合は、次のことができます。

zsh -c 'cp /home/user1/folder1/*(.om[1]) /home/user2/folder2'

パターンは、指定され/home/user1/folder1/*(.om[1])たディレクトリで最後に変更された一般ファイルの名前に展開されます。*(.om[1])最後に、o通常のファイル()を変更時間()で並べ替え、最初のファイル()を選択します。.m[1]

隠しファイル名を一致させる必要がある場合は、次のようにします。

zsh -c -4 'cp /home/user1/folder1/*(.om[1]) /home/user2/folder2'

(に追加-4

サブディレクトリをさらに表示するには、次を使用します。

zsh -c -4 'cp /home/user1/folder1/**/*(.om[1]) /home/user2/folder2'

シェルワイルドカードパターンは**パス名でzsh一致します/

関連情報