[英]How can I list all unique file names without their extensions in bash?
我有一項任務需要將一堆文件從一個目錄移動到另一個目錄。 我需要同時移動具有相同文件名(即blah.pdf,blah.txt,blah.html等)的所有文件,並且每四分鍾可以移動一組文件。 我有一個簡短的bash腳本,可以按這些間隔一次僅移動一個文件,但是新的名稱要求使我不滿意。
我的舊腳本是:
find ./ -maxdepth 1 -type f | while read line; do mv "$line" ~/target_dir/; echo "$line"; sleep 240; done
對於新腳本,我基本上只需要用一個沒有擴展名的唯一文件名列表替換find ./ -maxdepth 1 -type f
。 然后,我可以只替換do mv "$line" ~/target_dir/;
用do mv "$line*" ~/target_dir/;
。
所以,說了這么多。 用bash腳本獲取不帶文件名的唯一文件列表的好方法是什么? 我當時正在考慮使用正則表達式來獲取文件名,然后將其放入哈希中以獲取唯一性,但是我希望有一種更容易/更好/更快的方法。 想法?
可以容忍一線的怪異文件可能是:
find . -maxdepth 1 -type f -and -iname 'blah*' -print0 | xargs -0 -I {} mv {} ~/target/dir
如果文件可以以多個前綴開頭,則可以在find中使用邏輯運算符。 例如,要移動blah。*和foo。*,請使用:
find . -maxdepth 1 -type f -and \( -iname 'blah.*' -or -iname 'foo.*' \) -print0 | xargs -0 -I {} mv {} ~/target/dir
評論后更新。
這是我的處理方式:
find ./ -type f -printf '%f\n' | sed 's/\..*//' | sort | uniq | ( while read filename ; do find . -type f -iname "$filename"'*' -exec mv {} /dest/dir \; ; sleep 240; done )
也許需要一些解釋:
find ./ -type f -printf '%f\\n':
查找所有文件並僅打印其名稱,后跟換行符。 如果您不想查看子目錄,可以用一個簡單的ls
代替。 sed 's/\\..*//'
:通過刪除第一個點后的所有內容來去除文件擴展名。 foo.tar
和foo.tar.gz
都轉換為foo
; sort | unique
sort | unique
:對剛找到的文件名進行排序並刪除重復項; (
:打開一個子shell:
while read filename
:讀取一行並將其放入$filename
變量; find . -type f -iname "$filename"'*' -exec mv {} /dest/dir \\;
:在當前目錄中find .
( find .
)名稱以filename
值開頭的所有文件( -type f
)(- -iname "$filename"'*'
,這也適用於名稱中包含空格的文件)並執行每個命令上的mv
命令( -exec mv {} /dest/dir \\;
) sleep 240
:睡覺 )
:subshell的結尾。 添加-maxdepth 1
作為自變量,以find
符合您要求的內容。
沒關系,我很傻。 有一個uniq命令。 咄。 新的工作腳本是:
find ./ -maxdepth 1 -type f | sed -e 's/.[a-zA-Z]*$//' | uniq | while read line; do mv "$line*" ~/target_dir/; echo "$line"; sleep 240; done
編輯:忘記代碼和反斜杠上的關閉標記。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.