すべての私のhtmlファイルはここにあります:
/home/thinkcode/myfiles/html/
最新の10個のファイルをに移動したい/home/thinkcode/Test
私はこれまでにこれを持っています。訂正してください。ワンライナーを探しています!
ls -lt *.htm | head -10 | awk '{print "cp "$1" "..\Test\$1}' | sh
ls -lt *.htm | head -10 | awk '{print "cp " $9 " ../Test/"$9}' | sh
こちらはを使用しないバージョンls
です。ファイル名の奇妙な文字に対する脆弱性は低くなるはずです。
find . -maxdepth 1 -type f -name '*.html' -print0
\| xargs -0 stat --printf "%Y\t%n\n"
\| sort -n
\| tail -n 10
\| cut -f 2
\| xargs cp -t ../Test/
私find
はいくつかの理由で使用しました:
1)ディレクトリ内のファイルが多すぎる場合、bashはワイルドカード展開*を無効にします。
2)-print0
引数を使用find
して、ファイル名の空白を複数のトークンにbashで拡張する問題を回避します。
*実際、bashはワイルドカード拡張と環境変数用のメモリバッファーを共有しているため、厳密にはファイル名の数ではなく、ファイル名と環境変数の全長の関数です。環境変数が多すぎます=>ワイルドカード拡張がありません。
編集:@glennjackmanの改善のいくつかを取り入れました。find
大きなディレクトリで失敗する可能性のあるワイルドカード拡張の使用を回避するために、の最初の使用を維持しました。
cp
バックティックコマンドを理解しているようです。したがって、このようなコマンドを使用して、最新の10個のファイルを次のような別のフォルダーにコピーできます/test
。
cp `ls -t *.htm | head -10` /test
ls -lt *.html | head -10 | awk '{print $NF}' | xargs -i cp {} DestDir
上記の例DestDir
では、コピーの宛先ディレクトリです。
-t
xargsの後に追加して、実行中のコマンドを確認します。つまり、 xargs -i -t cp {} DestDir
。
詳細については、xargsコマンドを確認してください。
編集:@DennisWilliamsonによって指摘されたように(そして現在のマニュアルページもチェックして)、-i
オプションを再確認してくださいThis option is deprecated; use -I instead.
。
また、提示された両方の解決策は、質問のファイル名に依存し、空白やタブは含まれていません。