Вы можете использовать for
с подстановкой напрямую, удалить расширение .zip
с помощью конструкций оболочки и извлечь архив непосредственно в место назначения:
#!/bin/bash
cd "/path/to/source/location"
for file in *.zip; do
unzip "${file}" -d "/destination/for/unzip/${file%%.zip}" && rm "${file}"
done
mv LOCK* /destination/for/flat/files
Это также гарантирует, что архивы удаляются только в том случае, если они были успешно извлечены.
Конструкция с косой чертой точка -не «выполняет filename
как сценарий» -, это директива для оболочки (или какой-либо другой программы, интерпретирующей ввод )как «заглянуть в текущий каталог». Чаще всего он добавляется к двоичному файлу команды (или сценарию ), когда эта команда находится в текущем рабочем каталоге и когда текущий рабочий каталог не находится в пути поиска. Использование его в команде (, как в вашем примере qpdf
), — это способ получить исходные файлы из другого каталога, когда вы ожидаете, что выходные файлы попадут в каталог, в котором вы находитесь, когда вы вызываете команду.
Префикс./
(или любой путь )предотвращает использование в качестве параметров имен файлов, начинающихся с дефиса.
$ touch./-l foo bar
$ ls
bar foo -l
$ ls *
-rw-r--r-- 1 ilkkachu ilkkachu 0 Nov 3 15:10 bar
-rw-r--r-- 1 ilkkachu ilkkachu 0 Nov 3 15:10 foo
Основная проблема заключается в том, что это оболочка , которая расширяет подстановочный знак, и когда, например. ls
видит аргумент -l
, он не может знать, был ли он получен из подстановочного знака имени файла или пользователь написал его вручную.
Вышеупомянутый файл с именем -l
заставил ls
переключиться на длинный список. Другое такое имя файла могло закончиться ошибкой invalid option
. Или, что еще хуже, если команда была rm
, а у вас был файл с именем -rf
.
Это лишь одна из проблем, которая, возможно, является «неправильной» из-за непринужденного отношения Unix-систем к именам файлов. Для большего, чем вы хотите знать, см., например. эти эссе Дэвида Уилера: