2016-02-29 4 views
3

Я составляю скрипт для обработки 20 файлов. Все они расположены в разных каталогах. У меня есть частичное имя файла.Использование подстановочных файлов linux в cp и mv

  1. В каталоге журнала, File1_Date_time.err изменение File1__Date_time_orig.err
  2. кд ../scripts/
  3. Sh File.sh

каталог ФАЙЛ1/данные/data1directory/Sample_File1/журналы/File1_Data_time.err
каталог File2 является /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 Файл1
. runrunrun.sh File1
ш runrunrun.sh File1

мв: не может двигаться /data/data1directory/Sample_File1/logs/File1_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err: Нет такого файла или каталога ф также не получил подобную обратную связь

Могу ли я делать это правильно?

Спасибо!

+0

'mv',' cp' и т.д. ** не передаются подстановочные знаки, которые вы пишете **, если эти подстановочные знаки h ave любые действительные разложения. Вместо этого они передаются буквальными именами файлов, созданными путем запуска этих расширений. Таким образом, поскольку они не знают буквенных подстановочных знаков, используемых во входном имени, они не могут сопоставить '*' во входном имени '*' в имени вывода. –

+0

Если вы хотите написать инструменты переименования, то неплохо начать работу с BashFAQ # 30: http://mywiki.wooledge.org/BashFAQ/030 –

+0

Связанный: http://stackoverflow.com/questions/20629302/better-way -to-rename-files-based-on-multiple-patterns/25597051 –

ответ

2

Давайте поговорим о том, как шаблоны работают в течение минуты.

cp *.txt foo 

фактически не вызывать cp с аргументом *.txt, если какие-либо файлы, соответствующие этой Glob существуют. Вместо этого, он работает что-то вроде этого:

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 в качестве примера того, что они хотели чтобы соответствовать. Не могли бы вы отреагировать, чтобы сделать применимость к вопросу более ясным? –