2011-11-12 39 views
1

我正在編寫一個部署腳本,我需要運行一個較少的編譯器對目錄中的所有.less文件。這是很容易用下面的find命令這樣做:Bash找到:更改匹配的名稱使用在-exec

find -name "*.less" -exec plessc {} {}.css \; 

與一個名爲main.less文件,我留下了一個名爲main.less.css文件的文件夾上運行此命令後,但我希望它是main.css

我知道我可以用這個命令輕鬆地去除結果文件的無部分:rename 's/\.less//' *.css但我希望能夠學習一些關於使用-exec的新知識。

是否有可能修改在-exec參數中使用它時匹配的文件的名稱?

謝謝!

回答

3

你find命令是使用一對夫婦非標準GNU擴展:

  • 你沒有說明在哪裏可以找到,這是POSIX的錯誤但是GNU find在這種情況下選擇當前目錄
  • 您使用非隔離的{},POSIX find在這種情況下不會擴展它。

這裏是一個班輪應與大多數找工作的實現和解決您的雙擴展名的問題:

find . -name "*.less" -exec sh -c "plessc \$0 \$(dirname \$0)/\$(basename \$0 less)css" {} \; 

在Solaris 10及以上,sh -cksh -c更換如果路徑是不POSIX兼容。

2

不,不可能直接做。您只能使用{}直接插入完整的文件名。然而,在執行中,你可以放入其他東西,如awk。或者你可以通過管道將輸出重定向到另一個程序。

findman頁:

-exec command ; 
      Execute command; true if 0 status is returned. All following 
      arguments to find are taken to be arguments to the command until 
      an argument consisting of `;' is encountered. The string `{}' 
      is replaced by the current file name being processed everywhere 
      it occurs in the arguments to the command, not just in arguments 
      where it is alone, as in some versions of find. Both of these 
      constructions might need to be escaped (with a `\') or quoted to 
      protect them from expansion by the shell. See the EXAMPLES 
      section for examples of the use of the -exec option. The 
      specified command is run once for each matched file. The command 
      is executed in the starting directory. There are unavoidable 
      security problems surrounding use of the -exec action; you 
      should use the -execdir option instead. 
相關問題