2012-08-22 62 views
3

篩選我有包含具有以下諸多結構法與文件夾的子文件夾(/ ...)的文件夾:BASH - 找到特定的文件夾查找和使用正則表達式

_30_photos/combined 
_30_photos/singles 
_47_foo.bar 
_47_foo.bar/combined 
_47_foo.bar/singles 
_50_foobar 

用命令find . -type d -print | grep '_[0-9]*_'與結構中的所有文件夾將顯示**。但是,我已經生成了一個只捕獲* /組合文件夾的正則表達式: _[0-9]*_[a-z.]+/combined但是當我將它插入find命令時,將不會打印任何內容。

下一步是爲每個組合文件夾(我的硬盤上的某處)創建一個文件夾,並將組合文件夾的內容複製到新文件夾中。新的文件夾名稱應該與子文件夾的父名稱相同,例如_47_foo.bar。這可以通過搜索後的xargs命令來實現嗎?

+1

如果你插入你的正則表達式到-regex選項,找到請注意找到匹配的完整路徑 - >如果你從頭開始。那麼正則表達式必須匹配./whatever/come.here –

+1

這聽起來像一個[XY問題](http://mywiki.wooledge.org/XyProblem)。 mybecks,你真的*想要達到什麼目標? – ghoti

+0

是否有可能發現它應該只在這個(或預先定義的)目錄中搜索,當然也可以在所有子目錄中搜索 – mybecks

回答

3

有了基本grep你需要躲避+

... | grep '_[0-9]*_[a-z.]\+/combined' 

或者您可以使用「擴展的正則表達式」版本(egrepgrep -E [感謝chepner]),其中+不必是逃過一劫。

xargs可能不是上述複製最靈活的方式,因爲使用multiple commands會很棘手。您可以使用while循環找到更多的靈活性:

... | grep '_[0-9]*_[a-z.]\+/combined' | while read combined_dir; do 
    mkdir some_new_dir 
    cp -r ${combined_dir} some_new_dir/ 
done 

看一看bash string manipulation如果你想一個辦法來自動some_new_dir名稱。

+0

或使用'grep -E'或'egrep'。 – chepner

+0

如果我使用'echo $ combined_dir',它將輸出整個路徑./_00_foo.bar/combined。這沒關係。但現在我想複製/組合到主目錄(_00_foo.bar)的內容。因此,我在循環中使用了以下語法:'CURRENT_DIR = $(echo $ combined_dir | grep「_ [0-9] * _ [a-z。] \ +」)'但我沒有工作:( – mybecks

4

你不需要的grep:

find . -type d -regex ".*_[0-9]*_.*/combined" 

對於剩下:

find . -type d -regex "^\./.*_[0-9]*_.*/combined" | \ 
    sed 's!\./\(.*\)/combined$!& /somewhere/\1!' | \ 
    xargs -n2 cp -r 
1
target_dir="your target dir" 

find . -type d -regex ".*_[0-9]+_.*/combined" | \ 
    (while read s; do 
    n=$(dirname "$s") 
    cp -pr "$s" "$target_dir/${n#./}" 
    done 
) 

注:

  • 這個,如果你有換行符 「\ n」 個失敗您的目錄名稱
  • 這個使用子shell不弄亂你的ENV - 一個腳本中,你不需要那麼
  • 變化不大的正則表達式:[0-9]*[0-9]+
0

你可以使用這個命令:

find . -type d | grep -P "_[0-9]*_[a-z.]+/combined"