簡體   English   中英

我該如何寫一個可以搜索,重命名和替換文件的bash腳本

[英]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 ,並且srcdst是同級兄弟,並且命令是從公共父目錄運行的,請嘗試:

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的文件匹配,您只需使用cpmv即可實現所需的功能。

這遠不是最短的解決方案,但是一旦弄清所需的命令,它應該易於理解和改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM