2016-11-17 112 views
1

在bash,我的文件列表中的所有名稱相同(在不同的子目錄),我想通過創建/修改時間,這樣的事情對它們進行排序:用xargs獲取參數索引?

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

我想重命名這些文件用某種索引或某種東西,所以我可以將它們全部移到同一個文件夾中。我的結果理想情況是這樣的:

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

類似的東西。我會如何去做這件事?

回答

2

你可以通過這些文件循環,並保持附加一個遞增計數器所需的文件名:

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

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

編輯:爲了列出的文件我修改時間排序爲與案件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 ewlines,glob字符等,因爲我們在-printf選項中以NUL或\0字符結尾每個文件名。請注意,我們也使用sort -z來處理NUL終止的數據。

+0

他們在同一個目錄中,第一個子目錄不需要 – 123

+0

但是'$ f'將會是'/ tmp/tmp-foo/my-file.txt'或'/ tmp/tmp-bar/my- file.txt'和所需的輸出是'my-file0.txt','my-file1.txt'等等。所以我們需要去掉文件名的路徑。 – anubhava

+0

其實是的,我想我誤解了這個問題,nvm :) – 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