2013-11-24 100 views
1

我有很多的目錄,與結束「_和6位」,例如:批量重命名文件夾刪除尾隨字符

diff_gb_and_pf_2voids_158543 

我想找到在當前文件夾中的所有文件夾,將其重命名刪去最後的「_」和6位數字。

到目前爲止,我堅持用這個命令:

find . -type d -print |grep '.*[0-9]\{6\}$' |xargs -I {} bash -c 'for i in {}; do mv "$i" ????; done;' 

我找不到怎麼做的最後一步。我會嘗試打電話給sed,但是如何? 另外,如果有更好的方法,請告訴。

感謝

回答

1

捕獲這是一個使用你的shell的一種方式:

for i in $(find . -mindepth 1 -type d -regextype posix-extended -regex '.*_[0-9]{6}'); do 
    mv "$i" "${i%_*}"; 
done 
+0

這似乎工作,謝謝。你能解釋一下「$ {i%_ *}」嗎? – Napseis

+0

@Napseis:當然。這是bash參數替換,它從變量中刪除最短的後方模式('_ *')。關於[this](http://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html)的摘要表可能值得一看。乾杯。 – Steve

1

在這裏你去:

find /path -regex '.*_[0-9]\{6\}' -exec sh -c 'n="{}"; echo mv "{}" "${n%_*}"' \; 

檢查輸出,如果它看起來不錯,然後刪除echo在那裏。

說明:對每個匹配的文件,我們運行一個子shell,在這裏我們指定文件名可變n,這樣我們就可以使用模式替換${n%_*},它可以切斷最後_字符及其之後的所有直到結束的文件名。

或者這裏是應該在較老的系統工作了一種更簡便的方式:

find /path -name '*_[0-9][0-9][0-9][0-9][0-9][0-9]' | sed -ne 's/\(.*\)_[0-9]\{6\}$/mv "&" "\1"/p' 

檢查輸出,如果它看起來比它管sh好(追加此:| sh

說明:

  1. sed命令接收的文件列表重命名
  2. 在模式,我們捕捉到文件名的第一部分中\(... \)
  3. 我們用文字mv "&" "\1",其中&取代與被匹配的模式替換模式,在這種情況下,整個原始文件名,並\1取代有部分我們內\(... \)
+0

第一個不工作的我的外殼,但第二個呢。這也可以用 找到。 -regextype posix-extended -regex'。* _ [0-9] {6}'| sed -ne's/\(。* \)_ [0-9] \ {6 \} $/mv「&」「\ 1」/ p' 但是我不明白那部分,請你解釋一下?: mv「&」「\ 1」/ p – Napseis

+0

我在第一個解決方案中爲'sed'部分和'$ {n%_ *}'添加了解釋。 – janos

0
#!/usr/bin/env bash 
set -x 

ls -d diff* > dirlist 

while IFS='_' read field1 field2 field3 field4 field5 field6 
do 
mv -v "${field1}_${field2}_${field3}_${field4}_${field5}_${field6}" \ 
"${field1}_${field2}_${field3}_${field4}_${field5}" 
done < dirlist