在bash,我的文件列表中的所有名稱相同(在不同的子目錄),我想通過創建/修改時間,這樣的事情對它們進行排序:用xargs獲取參數索引?
ls -1t /tmp/tmp-*/my-file.txt | xargs ...
我想重命名這些文件用某種索引或某種東西,所以我可以將它們全部移到同一個文件夾中。我的結果理想情況是這樣的:
my-file0.txt
my-file1.txt
my-file2.txt
類似的東西。我會如何去做這件事?
在bash,我的文件列表中的所有名稱相同(在不同的子目錄),我想通過創建/修改時間,這樣的事情對它們進行排序:用xargs獲取參數索引?
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
編輯:爲了列出的文件我修改時間排序爲與案件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終止的數據。
所以我找到了我自己的問題的答案,關於這個問題的想法?
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系列印象深刻,認爲它非常整齊。
我很容易用'ls -1t'寫出我的答案,但必須避免解析'ls'的輸出。 – anubhava
@anubhava爲什麼是這樣?如何排序文件?你的回答沒有提供任何分類。 – cr125rider
檢查我的答案中的編輯部分進行排序。 [請查看爲什麼不應該解析'ls'的輸出](http://mywiki.wooledge.org/ParsingLs) – anubhava
他們在同一個目錄中,第一個子目錄不需要 – 123
但是'$ f'將會是'/ tmp/tmp-foo/my-file.txt'或'/ tmp/tmp-bar/my- file.txt'和所需的輸出是'my-file0.txt','my-file1.txt'等等。所以我們需要去掉文件名的路徑。 – anubhava
其實是的,我想我誤解了這個問題,nvm :) – 123