![](/img/trans.png)
[英]How do I write a bash script to replace words in files and then rename files?
[英]how do i write a such a bash script that can search, rename, and replace files
我在源文件夾中有一堆文件需要更新到目標文件夾。 源文件夾中的布局是平坦的,沒有子目錄,例如:
src\a.h
\a.c
\b.h
\b.c
\c.h
\c.c
目標文件夾包含多層深層子目錄,例如:
dst\App\a.h
\App\a.c
\USBD\CDC\b.h
\USBD\CDC\b.c
\USBH\CORE\FUNCTION\c.h
\USBH\CORE\FUNCTION\c.h
我需要遞歸搜索“ dst”目錄中的所有文件,如果它們與“ src”目錄中的任何文件匹配,然后將“ dst”中的文件重命名為XX.sav(XX是原始名稱)並將其從“ dst”復制到“ src”。
謝謝
假設您實際上要從src
復制到dst
,並且src
和dst
是同級兄弟,並且命令是從公共父目錄運行的,請嘗試:
find dst -type f -exec sh -c 'test -f src/${0##*/} &&
{ mv $0 $0.sav && cp src/${0##*/} $0; }' {} \;
如果最后兩個假設不正確,請嘗試(未經測試):
find /path/to/dst -type f -exec sh -c 'test -f $1/${0##*/} &&
{ mv $0 $0.sav && cp $1/${0##*/} $0; }' {} /path/to/src \;
您應該小心:如果dst
存在任何現有的.sav
文件,它們可能會被覆蓋;如果src
存在任何.sav
文件,您可能會.sav.sav
dst中的.sav.sav
文件是相關.sav
副本的副本。該命令本身創建的文件。 如果相關,請使用mv -i
解決。 如果現有文件數量很多,則mv -i
可能不是合適的解決方案。
有幾個步驟可以找到問題的解決方案。
首先,您需要遍歷src
文件夾中的所有文件,以確保您知道要在dst
查找的內容。 可以像這樣在bash中輕松完成此操作:
for filename in src/*
do
echo "$filename" # simple sanity check
done
現在您知道要查找的內容,可以使用命令find
嘗試在dst
查找文件。 由於此命令本身啟用了遞歸查找,因此您無需執行任何特殊操作。 但是,您可能需要查找文件名,而不是查找包含目錄結構的整個路徑。 這樣的事情應該起作用。
for filename in src/*
do
pattern=$(basename $filename) # remove folder from filename
for another_filename in $(find dst -name "$pattern")
do
echo "$filename -> $another_filename" # another sanity check
done
done
現在您有了src
的文件與dst
的文件匹配,您只需使用cp
和mv
即可實現所需的功能。
這遠不是最短的解決方案,但是一旦弄清所需的命令,它應該易於理解和改進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.