2016-11-17 17 views
1

、私は、ファイルのリスト(異なるサブディレクトリに)同じ名前のすべてを持っていると私は、作成/変更時、このようなもので、それらを注文したい:引数のインデックスをxargsで取得しますか? bashで

ls -1t /tmp/tmp-*/my-file.txt | xargs ... 

は、私はそれらのファイルの名前を変更したいです私はそれらをすべて同じフォルダに移動することができるように何らかのインデックスや何かを持っています。私の結果は、理想的には次のようなものになります。

my-file0.txt 
my-file1.txt 
my-file2.txt 

そういうものです。これをどうやってやりますか?の場合のようにリストされたファイルに私の修正時刻を並べ替えるために:

for f in /tmp/tmp-*/my-file.txt; do 
    fname="${f##*/}" 
    fname="${fname%.*}"$((i++)).txt 

    mv "$f" "/dest/dir/$fname" 
done 

EDIT:

答えて

2

あなただけのこれらのファイルをループし、目的のファイル名にインクリメントカウンタを付加しておくことができますls -1tあなたは、このスクリプトを使用することができます。

while IFS= read -d '' -r f; do 
    f="${f#* }" 
    fname="${f##*/}" 
    fname="${fname%.*}"$((i++)).txt 

    mv "$f" "/dest/dir/$fname" 
done < <(find /tmp/tmp-* -name 'my-file.txt' -printf "%[email protected] %p\0" | sort -zk1nr) 

これは空白のようなすべての特殊文字を含むファイル名を処理し、n個のNULまたは\0文字を各ファイル名の末尾に使用しているので、-printfのオプションでは、ewlines、glob文字などが含まれます。 NUL終了データの処理にはsort -zも使用しています。

+0

これらは同じディレクトリにあり、最初のサブは必要ありません – 123

+0

しかし、 '$ f'は'/tmp/tmp-foo/my-file.txt'または '/ tmp/tmp-bar/my- file.txt'であり、出力は 'my-file0.txt'、' my-file1.txt'などです。ファイル名のパスを削除する必要があります。 – anubhava

+0

実際、ええ、私は疑問を誤解していると思います。 – 123

0

私は自分自身の質問に対する答えを見つけましたが、これについての考えはありますか?

ls -1t /tmp/tmp-*/my-file.txt | awk 'BEGIN{ a=0 }{ printf "cp %s /tmp/all-the-files/my-file_%03d.txt\n", $0, a++ }' | bash; 

これは別のスタックオーバーフローの問題から、私の検索では最初に見つからなかったものを探しています。私はawkのラインに感銘を受け、それはかなりきれいだったと思った。

+0

'ls -1t'で簡単に答えを書くことができましたが、' ls'の解析出力は避けなければなりません。 – anubhava

+0

@anubhavaなぜですか?どのようにファイルを並べ替えるでしょうか?あなたの答えはどんな並べ替えも提供しませんでした。 – cr125rider

+0

ソートのために私の答えの編集部分を確認してください。 [lsの出力を解析してはならない理由をチェック](http://mywiki.wooledge.org/ParsingLs) – anubhava

関連する問題