2016-02-29 16 views
3

我正在編寫一個處理20個文件的腳本。他們都位於不同的目錄中。我有部分文件名。cp和mv中的linux通配符使用

  1. 在日誌目錄中,File1_Date_time.err變化到File1__Date_time_orig.err
  2. CD ../scripts/
  3. SH File.sh

File1中目錄是/數據/ data1directory/Sample_File1 /日誌/ File1_Data_time.err
文件2目錄/data/data2directory/Sample_File2/logs/File2_Data_time.err
.....

我的腳本看起來像這樣。 (runrunrun.sh)

#!/bin/bash 
INPUT=$1 
mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err 
cp /data/*/Sample_*/scripts/*.sh /data/*/Sample_*/scripts/*_orig.sh 
sh /data/*/Sample_*/scripts/*_orig.sh 

運行它時,我試了一下。
./runrunrun.sh File1
。 runrunrun.sh文件1
SH runrunrun.sh文件1

MV:不能移動/data/data1directory/Sample_File1/logs/File1_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err:沒有這樣的文件或目錄 CP也得到了類似的反饋

我這樣做是正確的嗎?

謝謝!

+0

'mv','cp'等。 **沒有通過你正在寫的通配符**,如果這些通配符h任何有效的擴展。相反,他們傳遞通過運行這些擴展創建的文字文件名。因此,由於他們不知道輸入名稱中使用的文字通配符,因此他們不可能將輸入名稱中的「*」映射到輸出名稱中的「*」。 –

+0

如果你想編寫重命名工具,一個好的開始是BashFAQ#30:http://mywiki.wooledge.org/BashFAQ/030 –

+0

相關:http://stackoverflow.com/questions/20629302/better-way - 重命名文件基於多模式/ 25597051 –

回答

2

讓我們來談談通配符如何工作一分鐘。

cp *.txt foo 

實際上不帶參數調用*.txtcp,是否存在任何匹配的水珠文件。相反,它運行的是這樣的:

cp a.txt b.txt c.txt foo 

同樣,像

mv *.txt *.old 

...不可能知道該怎麼辦,因爲當時的調用的話,它認爲是:

mv a.txt b.txt c.txt *.old 

,或者更糟的是,如果你已經有名爲一個z.old文件,它會看到:

mv a.txt b.txt c.txt z.old 

因此,您需要使用不同的工具。考慮:

# REPLACES: mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err 
for f in /data/*/Sample_*/logs/*_Data_time.err; do 
    mv "$f" "${f%_Data_time.err}_Data_time_orig.err" 
done 

# REPLACES: cp /data/*/Sample_*/scripts/*.sh /data/*/Sample_*/scripts/*_orig.sh 
for f in /data/*/Sample_*/scripts/*.sh; do 
    cp "$f" "${f%.sh}_orig.sh" 
done 

# REPLACES: sh /data/*/Sample_*/scripts/*_orig.sh 
for f in /data/*/Sample_*/scripts/*_orig.sh; do 
    if [[ -e "$f" ]]; then 
    # honor the script's shebang and let it choose an interpreter to use 
    "$f" 
    else 
    # script is not executable, assume POSIX sh (not bash, ksh, etc) 
    sh "$f" 
    fi 
done 

此使用parameter expansion添加新名稱前剝離舊名稱的尾端。

+0

謝謝!我會嘗試for循環。 –

+0

它完美地工作。謝謝! –

0

試試這個:

更改這些:

zc_cd_delim_01.csv 
zc_cd_delim_04.csv 

到這些:

zc_cd_delim_113_01.csv 
zc_cd_delim_113_04.csv 

命令行:

for f in zc_cd_delim_??.csv; do var1=${f%%??.*}; 
    mv $f "${var1}113_${f#$var1}"; 
done 
+0

'mv「$ f」',而不是 - 如果'''匹配一個帶有空格的文件名,或者'IFS'包含一個在名字中找到的字符(例如'_'),那麼行爲可能會令人驚訝。 –

+0

順便說一句,我有點不清楚這是如何適用於現在的問題 - 'c_cd_delim _ ??。csv'不像我所看到的OP模式之一那樣是一種他們想要的模式匹配。您是否介意編輯以使問題的適用性更清晰? –