⑴ linux批量修改文件後綴名Linux下批量修改文件名的方法
linux批量修改文件後綴名,Linux下批量修改文件名的方法很多人還不知道,現在讓我們一起來看看吧!
Linux下批量修改文件名的方法
在Linux環境下修改文件名可以有不同的命令方式,比如rename、mv都可以進行修改,如果用戶正在了解這方面的知識,可以閱讀下文了解Linux修改文件名以及批量修改文件名的方法。
對於單個的文件,可以直接使用命令,那如果有大量的類似格式的文件名需要修改成其他格式的,該如何呢?
比如某次測試後,保存的文件為 Lan1.txt,Lan2.txt,……Lan100.txt
這一百個文件需要在前面添加前綴變成類似 ch7_Lan1.txt,如果你還想使用mv來一個一個多痛苦啊。
當前文件夾下,文件修改有四種方式:
1、使用while Loop加${//}來實現Lan到ch7_Lan的替換。
01find . -name "Lan*txt" -type f | read files02do03new=04mv05done復制代碼
find . -name "Lan*txt" -type f | read filesdonew=mvdone
2、充分利用awk的分隔符功能來實現:
01ls *Lan* | awk 'BEGIN{FS="Lan";OFS="ch7_Lan"}{printf "mv "$0" ";$1=$1;print $0}' | sh復制代碼
ls *Lan* | awk 'BEGIN{FS="Lan";OFS="ch7_Lan"}{printf "mv "$0" ";$1=$1;print $0}' | sh
首先,修改FS和OFS,輸入和輸出的分隔符。
其次,使用awk中的命令,拼接「mv Lan1.txt ch7_Lan1.txt」這條命令。
最後,使用|sh來執行一個shell命令來完成mv動作。
其中,$1=$1是必須的,這個是完成Lan===> ch7_Lan的關鍵(其實是可以使用$2=$2等來替換,只要一個賦值動作而已)
奇怪的是,難道沒有賦值動作,分隔符的改變就不能檢測出來么?
3、使用awk的內置命令,gsub和system來實現替換和命令執行。
01ls "*Lan*" | awk '{org=$0;gsub("Lan", "ch7_Lan");system("mv "org" "$1)}'復制代碼
ls "*Lan*" | awk '{org=$0;gsub("Lan", "ch7_Lan");system("mv "org" "$1)}'
首先保存原始的數據。
其次修改 Lan為 ch_Lan
最後執行mv動作
其中,最後system命令"mv "org""需要使用""來標記。
而且org也需要"",並且不能使用$org
1、對於awk命令中的變數,不需要用$來引用。
2、在system()中,變數需要使用""來標識,否則就被當成字元串來處理。
3、如果對變數進行$來進行引用,就會出現兩種情況:
3.1、正常情況下,可以被當成位置參數來引用。比如 NF表示當前行的記錄個數。比如echo "a b c d" | awk '{print NF, $NF}',這個會列印兩個變數,第一個是NF本身,其值為4;第二個是第四個位置參數,也就是$4,也就是d
3.2、非正常情況下:
3.2.1、如果變數本身就是個字元串。比如echo "a b c d" | awk '{va=「varA「;print va, $va}',因為後一個參數$va,由於va是個字元串,因此$va列印的就是$0
3.2.2、如果變數本身就是個數字,但是該值大於NF。 比如echo "a b c d" | awk '{va="varA";vb=6;print va, $va, vb, $vb, 1}',因為$vb相當於是$6,但是位置參數$6沒有,因此列印的就是個空字元。
01[martin@TSPerPacketsTest]$ echo "a b c d" | awk '{print NF, }'024 d03[martin@TSPerPacketsTest]$ echo "a b c d" | awk '{va="varA";print va, }'04varA a b c d05[martin@TSPerPacketsTest]$ echo "a b c d" | awk '{va="varA";vb=6;print va, , vb, , 1}'06varA a b c d 6 1復制代碼
[martin@TSPerPacketsTest]$ echo "a b c d" | awk '{print NF, }'4 d[martin@TSPerPacketsTest]$ echo "a b c d" | awk '{va="varA";print va, }'varA a b c d[martin@TSPerPacketsTest]$ echo "a b c d" | awk '{va="varA";vb=6;print va, , vb, , 1}'varA a b c d 6 1
4、使用sed中的s來進行替換,然後使用e命令來執行:
01[martin@TSPerPacketsTest]$ ls *Lan* | sed -r -n 's/(.*)Lan(.*)/mv & 1ch_Lan2/e'復制代碼
[martin@TSPerPacketsTest]$ ls *Lan* | sed -r -n 's/(.*)Lan(.*)/mv & 1ch_Lan2/e'
關於sed的選項,使用 -r和 -n
-r 來啟用後續可以使用 command,比如 mv
-n 來關閉 patten space中內容的顯示。
關於sed的 command,使用e。如此在使用s命令完成 pattern space中 Lan到 ch7_Lan的修改後,啟動shell來執行 pattern space中的' mv指令。
如果這里使用 p,標記僅僅顯示 pattern space中的指令而已。
如果對於某目錄下的所有文件,進行文件名修改,有兩種方式:
1、匯集awk的 FS/OFS和 gsub/system來實現。有點類似於綜合上述2,3兩種方式。
01[martin@TSPerPacketsTest]$ find . -name "*Lan*" -type f | awk 'BEGIN{FS="/";OFS="/"}{org=$0;gsub("Lan", "ch7_Lan", );system("echo "org" "$0)}'復制代碼
[martin@TSPerPacketsTest]$ find . -name "*Lan*" -type f | awk 'BEGIN{FS="/";OFS="/"}{org=$0;gsub("Lan", "ch7_Lan", );system("echo "org" "$0)}'
為了實現所有目錄下的文件名進行修改,但是又不影響路徑上文件夾名。
首先,標記FS和OFS都為"/"。
其次,使用gsub時候,指定僅僅修改當前行中最後一個記錄,使用$NF來指定。
當然,對於FS和OFS的指定,可以不放置在 BEGIN中實現,比如:
01[martin@TSPerPacketsTest]$ find . -name "*Lan*" -type f | awk -vF=/ -vOFS=/ '{org=$0;gsub("Lan", "ch7_Lan", );system("echo "org" "$0)}'02[martin@TSPerPacketsTest]$ find . -name "*Lan*" -type f | awk -F/ -vOFS=/ '{org=$0;gsub("Lan", "ch7_Lan", );system("echo "org" "$0)}'復制代碼
[martin@TSPerPacketsTest]$ find . -name "*Lan*" -type f | awk -vF=/ -vOFS=/ '{org=$0;gsub("Lan", "ch7_Lan", );system("echo "org" "$0)}'[martin@TSPerPacketsTest]$ find . -name "*Lan*" -type f | awk -F/ -vOFS=/ '{org=$0;gsub("Lan", "ch7_Lan", );system("echo "org" "$0)}'
2、或者使用 sed。
01[martin@TSPerPacketsTest]$ find . -name "*Lan*" -type f | sed -r -n 's/(.*)([^/]*)Lan([^/]*)$/mv & 12ch7_Lan3/e'復制代碼
[martin@TSPerPacketsTest]$ find . -name "*Lan*" -type f | sed -r -n 's/(.*)([^/]*)Lan([^/]*)$/mv & 12ch7_Lan3/e'
其中的各個 option和 command參數,上述都已經有介紹了。
這里,針對文件夾名和文件名,使用了簡單的sed內置的正則表達式來進行匹配而已,來實現僅僅對文件名的修改。
以上步驟在Linux修改文件名以及批量修改文件名的實現方式,是在shell中使用find、exec、xargs、mv命令組合批量替換文件名中的字元串。
⑵ linux命令怎麼把一個文檔下的所有文件都改名
|1.用for靈活,文件名中字元替換,加日期等都可
先用下面語句測試一下
for i in *aa* ;do NN=$(echo $i |內 sed 's/aa/bb/') ;echo "$NN";done
保險容起見,只拷貝
for i in *aa* ;do NN=$(echo $i | sed 's/aa/bb/') ;cp "$i" "$NN";done
這是更名,慎用
for i in *aa* ;do NN=$(echo $i | sed 's/aa/bb/') ;mv "$i" "$NN";done
2.用rename簡潔
先用-n開關測試
rename -n 's/aa/bb/' *
測試無誤去掉-n進行更名
rename 's/aa/bb/' *
⑶ Linux|如何查找和刪除重復文件
在Linux系統管理文件時,處理重復文件是一項繁瑣的任務,特別是當你經常從網路下載資料時。本文將教你如何利用 rdfind、fpes、rmlint、DupeGuru 和 FSlint 等命令行工具以及圖形界面程序來識別和移除這些不必要的重復文件,同時強調謹慎操作以避免誤刪重要數據。
這個免費的命令行工具 rdfind(重復數據查找)可在單個或跨目錄中搜索重復文件,它會深入檢查文件內容,幫助你決定保留哪個版本。安裝後,只需輸入命令和目標目錄,結果會保存在名為 results.txt 的文件中。使用 -dryrun 選項可查看重復文件列表,而不執行操作。考慮使用硬鏈接替換重復文件或通過 -d 選項刪除。
安裝 fpes 後,用法與 rdfind 類似。通過指定目錄和選項,如 -r 遞歸搜索,-S 顯示大小,-m 提供匯總信息,-d 刪除重復項,但避免使用 -N 僅保留第一個文件。查看幫助文檔以獲取更多信息。
Rmlint 專注於查找和清理類似 lint 的重復或冗餘文件,包括空文件和損壞的鏈接。安裝後,它能幫助你識別和清理系統中的這些問題。
跨平台的開源工具 peGuru 適合尋找文件名或內容的重復,提供模糊匹配功能。安裝後,可以在不同平台如Linux上使用,幫助你精確地找到和清理重復文件。
FSlint 是一個免費的清理工具,能檢測重復文件、空目錄等,支持命令行和圖形界面操作。安裝後,可根據需要使用其功能進行系統清理。
總的來說,這些工具是Linux系統中查找和處理重復文件的強大武器,但在操作前務必備份重要數據,確保安全地清理您的文件系統。
⑷ linux修改文件名linux批量改文件名解決方法
本文將詳細介紹linux如何修改文件名 linux 如何批量改文件名解決方法,需要了解更多的朋友可以參考下今天在刪這種文件名刪到惡心:
-rw-r--r-- 1 work work 0 Mar 26 17:27 -rw-r--r--0.l
-rw-r--r-- 1 work work 0 Mar 26 17:27 -rw-r--r--1.l
-rw-r--r-- 1 work work 0 Mar 26 17:27 -rw-r--r--2.l
-rw-r--r-- 1 work work 0 Mar 26 17:27 -rw-r--r--3.l
-rw-r--r-- 1 work work 64 Mar 26 17:27 -rw-r--r--.r
-rw-r--r-- 1 work work 0 Mar 26 17:27 -rwxr--r--0.l
-rw-r--r-- 1 work work 0 Mar 26 17:27 -rwxr--r--1.l
-rw-r--r-- 1 work work 0 Mar 26 17:27 -rwxr--r--2.l
-rw-r--r-- 1 work work 0 Mar 26 17:27 -rwxr--r--3.l
-rw-r--r-- 1 work work 64 Mar 26 17:27 -rwxr--r--.r
具體辦法:
Linux中"-"有特殊的含義,比如在命令的後面加"-"表示後面跟的是選項。但是如何新建帶名字中有"-",下面介紹三種方法,比如要新建文件"-a":
1、cd . > -a
2、vi -- -a
3、echo "" > -a
上面三種方法都可以在當前目錄下新建一個"-a"文件,當然還可以有別的方法新建,這里就不在介紹。如果要刪除"-a"就比較麻煩了,如果你輸入 rm -a,系統會提示你:
rm:無效選項 -- a
請嘗試執行『rm --help』來獲取更多信息。
對於這樣的文件可以有兩種方法來刪除,如下所示:
1、rm ./-a
2、rm -- -a
改名字也不用說了,基本上就是在文件名前面加"--"來表示轉義字元就可以了!