2011-01-21 77 views
10

我在一堆具有前導點並因此被隱藏的目錄中有一些文件。我想恢復並刪除前導點。從文件名bash腳本中刪除前導點

我是不成功的下列要求:

for file in `find files/ -type f`; 
do 
base=`basename $file` 
if [ `$base | cut -c1-2` = "." ]; 
then newname=`$base | cut -c2-`; 
dirs=`dirname $file`; 
echo $dirs/$newname; 
fi 
done 

的情況聲明,失敗:

[: =: unary operator expected 

此外,一些文件在他們身上有空間和文件返回它們分裂。

任何幫助,將不勝感激。

+0

當你說`恢復那個`,你的意思是重命名沒有點的文件? – SiegeX 2011-01-21 19:41:42

+0

是的,去掉前導點 – Radek 2011-01-21 19:43:24

回答

21

從變量的起始處刪除某些東西的最簡單方法是使用${var#pattern}

$ FILENAME=.bashrc; echo "${FILENAME#.}" 
bashrc 
$ FILENAME=/etc/fstab; echo "${FILENAME#.}" 
/etc/fstab 

見bash手冊頁:

$ {參數#字}
$ {參數##字}

word被擴展爲一個模式,就像路徑名擴展一樣。如果模式匹配參數值的開始,那麼擴展結果爲 帶最短匹配模式(''#''大小寫)或最長匹配模式(''## ''的情況)刪除。

順便說一句,有了更具選擇性的find命令,你不需要做所有的努力工作。你可以有find只帶有前導點匹配的文件:

find files/ -type f -name '.*' 

ETC技術一起,然後:

find files/ -type f -name '.*' -printf '%P\0' | 
    while read -d $'\0' path; do 
     dir=$(dirname "$path") 
     file=$(basename "$path") 
     mv "$dir/$file" "$dir/${file#.}" 
    done 

其他注意事項:

  1. 要正確地用空格處理文件名當你引用變量名時你需要引用變量名。寫「$文件」,而不是隻有$file

  2. 爲了增強魯棒性,-printf '\0'read -d $'\0'使用NUL字符作爲分隔符,因此即使嵌入換行符'\n'的文件名也可以使用。

6
find files/ -name '.*' -printf '%f\n'|while read f; do 
     mv "files/$f" "files/${f#.}" 
done 
2
  1. 該腳本將與您 可以扔掉它的任何文件,即使他們有 空格,換行或其他惡意 字符他們的名字。
  2. 它的工作原理,無論隱藏的文件多少子目錄深
  3. 不像其他的答案到目前爲止,你 變更時, 給find的路徑來改變腳本的其餘部分

*注:我包含一個echo,以便您可以像幹運行一樣對其進行測試。如果您對結果滿意,請刪除單個echo

find . -name '.*' -exec sh -c 'for arg; do d="${arg%/*}"; f=${arg:${#d}}; echo mv "$arg" "$d/${f#.}"; done' _ {} + 
相關問題