第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用find和sed遞歸重命名文件

使用find和sed遞歸重命名文件

慕勒3428872 2019-11-25 13:13:29
我想瀏覽一堆目錄,然后將以_test.rb結(jié)尾的所有文件重命名為以_spec.rb結(jié)尾的文件。這是我從來沒有想過如何使用bash的東西,所以這次我想我會花些力氣將它釘牢。不過到目前為止,我的最大努力是:find spec -name "*_test.rb" -exec echo mv {} `echo {} | sed s/test/spec/` \;注意:exec之后有一個額外的回顯,以便在測試時打印命令而不是運行命令。當我運行它時,每個匹配文件名的輸出是:mv original original即用sed替代已丟失。訣竅是什么?
查看完整描述

3 回答

?
慕姐4208626

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在一個命令中可能有一些錯誤的使用方式和大量的引號來完成所有這些操作,但是我不會嘗試。)


查看完整回答
反對 回復(fù) 2019-11-25
?
慕慕森

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。


查看完整回答
反對 回復(fù) 2019-11-25
?
慕尼黑的夜晚無繁華

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è)置該選項)


查看完整回答
反對 回復(fù) 2019-11-25
  • 3 回答
  • 0 關(guān)注
  • 1282 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號