2016-06-23 110 views
0

我有很多帶空格和大寫字母的文件夾,以及帶空格和井號標籤的文件。我想擺脫一個文件夾中所有子文件夾中的空格和大寫字母,並將文件名改爲沒有空格和標籤的文件名。我怎樣才能做到這一點?如何在bash中替換文件夾和文件名?

我的輸入是目錄的路徑,例如'/ Images'。在'Images'文件夾中,我有文件夾,如'Mary','Kate'等。這些文件夾包含諸如'Kate#1.png''Kate#2.png'之類的圖像。我想將'Images'中的所有文件夾名稱更改爲'mary','kate'等,並將所有文件名改爲'kate1.png','kate2.png'。

+0

請提供樣品的輸入和預期的輸出 – Inian

+0

@Inian我已經更新了我的問題 – uksz

回答

1

裏面目錄圖片/,一個選擇可能是

find . -mindepth 1 -type d | while read f; do mv -v "$f" "$(echo "$f" | tr [:upper:] [:lower:] | tr -d ' #')"; done 
find . -mindepth 1 -type f | while read f; do mv -v "$f" "$(echo "$f" | tr [:upper:] [:lower:] | tr -d ' #')"; done 

這兩條線也可以通過for type in d f; do ...; done他們周圍,因爲類型是唯一改變的內容組合成一個;但我認爲這更容易理解。

如果您不喜歡文件名不發生變化時的警告,您可以在之前檢查f和新文件是否相同。

編輯:這是一個小型的獨立腳本來完成您的任務。至於你說你輸入的目錄,我假設你將它傳遞給腳本作爲命令行參數$ 1

#!/bin/bash 

if [ -z "$1" ]; then 
    echo "usage: $0 directory" 
    exit -1 
fi 

cd "$1" 

for type in d f 
do 
    find . -mindepth 1 -type $type | while read f 
    do 
     mv -v "$f" "$(echo "$f" | tr [:upper:] [:lower:] | tr -d ' #')" 
    done 
done 
1
cd yourPath 

然後給這兩條線一試:

find . -type d|awk -vq='"' '{o=$0;gsub(/[# ]/,"");$0=tolower($0)}$0!=o{printf "mv %s%s%s %s%s%s\n",q,o,q,q,$0,q}' 
find . -type f|awk -vq='"' '{o=$0;gsub(/[# ]/,"");$0=tolower($0)}$0!=o{printf "mv %s%s%s %s%s%s\n",q,o,q,q,$0,q}' 

如果打印mv ..命令是否正確,加|sh到命令結束,它會爲你做的工作。

相關問題