次のコマンドを使用して、ディレクトリ内の最新のファイルをインポートします。
/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
一致します/
。