2012-05-15 17 views
6

アル私のhtmlファイルはここに常駐:最新の上位10個のファイルを1つのディレクトリから別のディレクトリにコピーする方法は?

/home/thinkcode/myfiles/html/ 

私は私がこれまでにこれを持って/home/thinkcode/Test

に、最新の10個のファイルを移動します。私を修正してください。私は1ライナーを探しています!

ls -lt *.htm | head -10 | awk '{print "cp "$1" "..\Test\$1}' | sh 
+3

'xargs'を使って' awk' + 'sh'(醜い感じ)を避けたり、' find ... -exec'を使って1つのコマンドだけ実行することができます。 – KurzedMetal

+0

私はfindを行うことができましたが、awkを使って同じことをする方法が不思議でした! – ThinkCode

+3

[BashFAQ/003](http://mywiki.wooledge.org/BashFAQ/003)および[BashFAQ/099](http://mywiki.wooledge.org/BashFAQ/099)を参照してください。 –

答えて

9
ls -lt *.htm | head -10 | awk '{print "cp " $9 " ../Test/"$9}' | sh 
+5

'ls'は、特殊文字を含むファイル名をリストするのは悪いことです。また、 'ls -l'の出力を解析するのは危険です。すべてのファイルを統計し、結果を日付順にソートする小さなperlスクリプトを書く方がよいでしょう。 'ls'を使わなければならない場合は、少なくとも' -l'引数を省略してください... 'ls -t * .html |ヘッド-10 'も同様に機能します。 –

4
ls -lt *.html | head -10 | awk '{print $NF}' | xargs -i cp {} DestDir 

上記の例DestDirでコピー先ディレクトリです。

xargsの後に-tを追加すると、実行時にコマンドが表示されます。すなわち、xargs -i -t cp {} DestDir

詳細については、xargs commandを参照してください。

EDIT:@DennisWilliamsonで指摘したように(とも現在のmanページを確認するには)-iオプションThis option is deprecated; use -I instead.を再度。

また、質問のファイル名に応じて表示される解決策はどちらも、空白やタブが含まれていません。

+0

../testディレクトリにファイルをコピーする方法は? – ThinkCode

+0

ls -lt * .htm | | awk '{print $ NF}' | xargs cp * ../Test/?動作しません。パイプからファイル名を収集し、コピーコマンドにフィードする方法は? – ThinkCode

+0

それは '{}'ではなく '*'ではありません –

6

ここには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)findへの引数を-print0とすると、ファイル名の空白を複数のトークンに拡張するbashの問題が回避されます。

*実際には、bashはワイルドカード展開用のメモリバッファとその環境変数を共有しているため、厳密にはファイル名の数ではなく、ファイル名と環境変数の合計長です。環境変数が多すぎます=>ワイルドカードは展開されません。

編集:@ glennjackmanの改良のいくつかが組み込まれています。大きなディレクトリで失敗する可能性のあるワイルドカード拡張の使用を避けるために、最初にfindを使用しないようにしてください。

+3

lsを使用しない場合は+1。もう少し簡単にできます: 'stat -c"%Y \ t%n "* .html |ソート-n |テール-10 |カット-d "" -f 2- | xargs cp -t ../ Test' –

+0

@glennjackman:貼り付けたときに印刷されるタブ文字の切り取りですか? – ToolmakerSteve

+0

良い点。 'cut -d $ '\ t' ...' –

関連する問題