2013-11-05 88 views
2

我有這個小腳本,推出了一些目錄路徑。 我想mkdir所有這些路徑。從grep和管道mkdir

for filename in $(git ls-files | grep .java | grep -v 'com/foo' | sed -e 's/\(.java[^/]*\).java/\1/' | uniq) 
do 
echo "$filename" | sed -e 's/com\/old\/old/com\/new/' | sed 's/\(.*\)\/.*/\1/' 
done 

所以新的目錄中創建... COM /老/舊= COM /新

但我不能拿到的mkdir工作...我想...

path=$("$filename" | sed -e 's/com\/old\/old/com\/new/' | sed 's/\(.*\)\/.*/\1/') 
mkdir -p "$path" 

這只是搞亂了文件內容。

回答

0

您應該能夠在一個sed命令中執行所有替換操作,並且還可以過濾出com/foo。然後將輸出傳送到一個while read循環。

git ls-files | grep .java | 
     sed -e '/com\/foo/d' -e 's/\(.java[^/]*\).java/\1/' -e 's/com\/old\/old/com\/new/' -e 's/\(.*\)\/.*/\1/' | 
     uniq | while read path; do 
    mkdir -p "$path" 
done 

以下是如何做你git mv

git ls-files | grep .java | 
     sed -e '/com\/intuit/d' -e 's/\(.java[^/]*\).java/\1/' | uniq | 
    while read path; do 
     dir=$(echo "$path" | sed -e 's/com\/old\/old/com\/new/' -e 's/\(.*\)\/.*/\1/') 
     mkdir -p "$dir" 
     git mv "$path" "$dir" 
done 
+0

一個小更新..所以MKDIR工作,但我居然還需要與git MV的目錄後的文件被創建。所以我需要原始文件路徑。這只是迴應原始路徑,然後是新路徑。 (git ls-files | grep .java | grep -v'com/intuit'| sed -e's/\(。java [^ /] * \)。java/\ 1 /' | uniq); 做 echo $文件 echo $文件| sed -e's/com \/old \/old/com \/new /' done – klind

+0

只刪除刪除文件名的'sed'表達式。在循環體中,使用'dirname $ path'來獲取'mkdir'的目錄部分,然後將文件移入它。 – Barmar

+0

我在做這個.. git ls-files | grep .java | sed -e'/ com \/intuit/d'-e's/\(。java [^ /] * \)。java/\ 1 /'| uniq |同時讀取路徑;做 git mv $ path'$ path | sed -e's/com \/old \/old/com \/new /'' done 但是,這只是搞亂了文件的內容..(那實際上還需要在下一步中做) – klind