3 回答

TA貢獻1852條經(jīng)驗 獲得超7個贊
發(fā)生這種情況是因為sed接收到該字符串{}作為輸入,可以使用以下命令進行驗證:
find . -exec echo `echo "{}" | sed 's/./foo/g'` \;
foofoo遞歸地為目錄中的每個文件打印。出現(xiàn)這種情況的原因是,當管道擴展整個命令時,管道將由外殼執(zhí)行一次。
由于無法通過外殼執(zhí)行命令并且沒有管道或反引號的概念,因此無法以對每個文件都執(zhí)行sed管道的方式來引用管道。GNU findutils手冊介紹了如何通過將管道放置在單獨的shell腳本中來執(zhí)行類似的任務(wù):findfind
#!/bin/sh
echo "$1" | sed 's/_test.rb$/_spec.rb/'
(sh -c在一個命令中可能有一些錯誤的使用方式和大量的引號來完成所有這些操作,但是我不會嘗試。)

TA貢獻1856條經(jīng)驗 獲得超17個贊
要以最接近原始問題的方式解決它,可能要使用xargs“每個命令行的args”選項:
find . -name *_test.rb | sed -e "p;s/test/spec/" | xargs -n2 mv
它遞歸地在當前工作目錄中查找文件,回顯原始文件名(p),然后回顯修改的名稱(s/test/spec/),并將它們?nèi)縨v成對地饋入(xargs -n2)。注意在這種情況下路徑本身不應(yīng)包含字符串test。

TA貢獻1864條經(jīng)驗 獲得超6個贊
您提到您正在bash用作外殼,在這種情況下,您實際上并不需要使用find它sed來實現(xiàn)要重命名的批處理...
假設(shè)您將其bash用作外殼程序:
$ echo $SHELL
/bin/bash
$ _
...并假設(shè)您啟用了所謂的globstarshell選項:
$ shopt -p globstar
shopt -s globstar
$ _
...最后假設(shè)您已經(jīng)安裝了該rename實用程序(可在util-linux-ng軟件包中找到)
$ which rename
/usr/bin/rename
$ _
...然后您可以按以下步驟在bash一線式中實現(xiàn)批量重命名:
$ rename _test _spec **/*_test.rb
(globstarshell選項將確保bash能夠找到所有匹配的*_test.rb文件,無論它們在目錄層次結(jié)構(gòu)中的嵌套深度如何...用于help shopt了解如何設(shè)置該選項)
添加回答
舉報