2013-09-27 35 views
1

我有所謂的「圖像」我的桌面上的文件夾,該文件夾內有3張圖片...如何在Mac OSX重命名使用巖組外殼和`sed`命令文件

File-A-B.gif 
File-C-D.gif 
File-E-F.gif 

...我想要重命名命令行中的文件,以便刪除第二個連字符/短劃線。因此,其結果將是文件命名,像這樣......

File-AB.gif 
File-CD.gif 
File-EF.gif 

...我用命令的組合,通過管道輸送到對方,但在讓他們的工作沒有多少運氣。

起初我ls File-* | sed 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh

此命令的擊穿是...

  • 名單的是開始File-
  • 管的結果通過對sed
  • 我們」的任何文件將使用sed捕捉名
  • 不同地區看第一個文件,我們會捕捉到File-AB.gif
  • sed我們再一招命令替換匹配的文件名,並有效地告訴它的原始文件重命名爲彌補數據的兩件的文件,我們已經捕獲
  • 我們就通過管道該命令通過到sh

我得到的初始錯誤是一個權限錯誤。我不確定爲什麼我有'讀寫'權限訪問這些文件。

若要解決此我chmod 777每個文件。

這就產生了一個新的錯誤這是cannot execute binary file

要解決這個錯誤我看到這個帖子:http://blog.mpdaugherty.com/2010/05/27/difference-with-sed-in-place-editing-on-mac-os-x-vs-linux/這表明增加一對額外的單引號。這部作品的原因(顯然)是因爲sed將錯誤,因爲它不知道是幹什麼用的文件擴展名,而是把一個空字符串中和的錯誤(在一個側面說明:我的理解是,你還需要使用-i標誌 - 我沒有使用 - 但這樣做導致了一個不同的錯誤,所以我廢除了,只是用單引號來避免我得到的二進制文件錯誤)。

所以現在我有ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh

但隨着No such file or directory這樣的錯誤?

我想是明確與文件的位置,因此,例如...

ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv ~\/Desktop\/Images\/& ~/Desktop\/Images\/\1\2/' | sh 

...通知我不得不逃離斜線~\/Desktop\/Images\/但是這仍然沒有工作。

我也安裝使用自制的sed GNU版本,但它也有gsed: can't read s/\(Vim-[^-]\)-\(.+\)/mv & \1\2/: No such file or directory

差錯以類似的方式我有點茫然與我怎麼能得到這個工作。

我不想訴諸寫一個bash/zsh腳本或Ruby腳本。

任何幫助,你可以給我將不勝感激。

回答

1

以下應爲你工作:

ls File-* | sed 's/\(.*\)-\(.*\)/mv & \1\2/' | sh 

你試過

ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh 

是很接近的。說:

ls File-* | sed '' 's/\(File-[^-]*\)-\(.*\)/mv & \1\2/' | sh 

反而會工作。

+0

謝謝!看起來你提到的第一個選項適用於我,但它確實在輸出中產生了一個錯誤(即使它正確地重命名了這些文件)? 錯誤是'preexec:4:command not found:^ A^B'你知道這意味着什麼嗎?注意,你說的最後一個例子是我幾乎有的,沒有奏效。 但我明白爲什麼第一個版本能夠工作(我認爲),我們使用'echo'和'$()'組合插入其他命令。我不是100%確定'$()'通常用於什麼? 你能否給你的答案增加額外的解釋來幫助我(和其他人)更好地理解:) – Integralist

+0

'$()'是過程替換。我想因爲我們不管怎樣管道到'sh',這不是必需的。見上面的編輯。 – devnull

+0

這很有道理。謝謝! – Integralist

1

如果您使用zsh,你不需要使用sed:有一個zsh module called zmv那會很簡單地實現這一點:

$ ls -F -G 
File-A-B.gif File-C-D.gif File-E-F.gif 

$ zmv -n 'File-(*)-(*).gif' 'File-${1}${2}.gif' 
mv -- File-A-B.gif File-AB.gif 
mv -- File-C-D.gif File-CD.gif 
mv -- File-E-F.gif File-EF.gif 

注:省略-n得到它的實際運行。

它通過匹配括號內的東西來工作。在這種情況下:File-(*)-(*).gif將匹配File-A-B.gif並且還保存AB,因此我們可以稍後參考它們。然後,我們將剛剛匹配的文件移動到一個新文件名中,省略兩個字母之間的連字符並使用引用插入字母:File-${1}${2}.gif

它是一個相當強大的小模塊,只要您可以給它兩個正則表達式:一個匹配要重命名的文件,另一個匹配重命名的文件名。