2015-07-15 14 views
3

Я пытаюсь переместить все файлы в ряд каталогов в подкаталог их соответствующей папки. Есть много папок, для которых это необходимо, поэтому я поставил их в цикле. Для примера я сократил число.mv not Recognifying Wildcards/Variable Expansion

read var1 
case ${var1} in a) sub="sub_directory1";; b) sub="sub_directory2";; esac 

for ((i=1; i<=5; i++)); do 
    case ${i} in 
    1) t=a;; 2) t=b;; 3) t=c;; 4) t=d;; 5) t=d;; 
    esac 
    mv "${location[files]}${t}/*.*" "${location[files]${t}/${sub} 
done 

${location[files]}, ${t} и ${sub} все каталоги, так что структура выглядит примерно так:

/files/a/file1.txt 
/files/a/file2.txt 
/files/a/sub_directory1 
/files/a/sub_directory2 
/files/b/file33.txt.3824 
/files/b/file52f.log.345 
/files/b/sub_directory1 
/files/b/sub_directory2 

так далее, и так далее. Идея состоит в том, что файлы в /files/a/ будут перенесены в files/a/sub_directory1.

Когда я запускаю это в скрипте, он, по-видимому, правильно расширяет переменные, но, очевидно, не правильный путь для mv. Я получаю

mv: cannot rename files/a/*.* /files/a/sub_directory1/*.*: 
No such file or direbctory 

Когда я делаю то же команда вручную:

mv /files/a/*.* /files/a/sub_directory1 

работает как задумано.

Это то, что подстановочные знаки обрабатываются буквально?

+3

Внутри двойных кавычках шарики не растягиваются. Вам нужно оставить их вне кавычек. –

+0

Для кого-то другого, нового для меня, как я в будущем, который может это прочитать, комментарий Этана решил мою проблему. Я переместил цитату перед звездочкой в ​​команде MV. – mkingsbu

+0

Какова мотивация этого сценария? – chicks

ответ

2

Двойная цитата предотвращает расщепление слов и глобусы при разрешении расширения переменной, т. Е. "*.*" - это просто строка буквально *.*. Для того, чтобы сделать подстановку на именах файлов, вы можете сделать:

mv "${location[files]}${t}"/*.* "${location[files]}${t}/${sub}" 

More info on Bash manual.