Давайте проверим ваше понимание шаблонов и вычисления переменных. Предположим, вы находитесь в каталоге с двумя подкаталогами, mammals и reptiles11. И, как ни странно, в подкаталоге mammals находятся файлы lizard.txt и snake.txt12:
$ ls
mammals reptiles
$ ls mammals
lizard.txt snake.txt
Поскольку ящерицы и змеи не являются млекопитающими, эти два файла следует переместить в подкаталог reptiles. Вот два способа сделать это, но один работает, а другой нет:
mv mammals/*.txt reptiles Метод 1
FILES="lizard.txt snake.txt"
mv mammals/$FILES reptiles Метод 2
Метод 1 работает, потому что шаблон соответствует всему пути к файлу — имя каталога mammals является частью обоих совпадений для mammals/*.txt:
$ echo mammals/*.txt
mammals/lizard.txt mammals/snake.txt
Таким образом, метод 1 работает так, как если бы вы набрали следующую корректную команду:
$ mv mammals/lizard.txt mammals/snake.txt reptiles
В методе 2 используются переменные, имеющие только свои буквальные значения, и нет специального инструмента для вычисления путей к файлам:
$ echo mammals/$FILES
mammals/lizard.txt snake.txt
Следовательно, метод 2 работает так, как если бы вы набрали следующую не совсем корректную команду:
$ mv mammals/lizard.txt snake.txt reptiles
Эта команда ищет файл snake.txt в текущем каталоге, а не в каталоге mammals, и выдает ошибку:
$ mv mammals/$FILES reptiles
/bin/mv: cannot stat 'snake.txt': No such file or directory
Чтобы сделать метод 2 рабочим, используйте цикл for, который добавляет имя каталога mammals к каждому имени файла:
FILES="lizard.txt snake.txt"
for f in $FILES; do
mv mammals/$f reptiles
done
Linux. Командная строка. Лучшие практики
·
Дэниел Джей Барретт