簡體   English   中英

如何在bash中列出所有不帶擴展名的唯一文件名?

[英]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.tarfoo.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 :睡覺
  • ) :subshel​​l的結尾。

添加-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM