Это действительно легкий w/ pax
. В нем есть понятие опции -s
ubstitution, которая может изменять имена файлов по мере их написания. Также можно указать несколько аргументов -s
ubstitution. И, что наиболее уместно, в данном случае, у выбранных членов есть только такое количество аргументов -s
ubstitution, которое необходимо для успешного выполнения одного совпадения, но любая подстановка, в результате которой имя файла становится нулевым, приводит к тому, что файл совпадения не будет выбрано.
Для демонстрации:
mkdir test; cd test
touch match nomatch
pax -ws '|^.*/match$|&|' -s '|.*||' ./ |
pax -v
Вышеуказанное делает и изменяет в каталог ./test
, создает два файла, затем -w
обновляет архив tar
в трубу w/ pax
, содержимое которой вторым pax
-v
erbosely перечисляет. Вышеуказанное печатается:
-rw-r--r-- 1 mikeserv mikeserv 0 Feb 22 11:40 ./
...потому что ./соответствует
совпадает -v с окончательной подстановкой, которая заменяет все символы в любом имени файла.
А с pax
на самом деле вам не нужно копировать содержимое файла в его архив - вы можете использовать -rwl
, которая является операцией копирования, создающей жесткие связи.
Итак, если ваш файл был назван paxscript
и выглядел как....
cd -- "$1"
pax -rwvl \
-s '|^.*/image1\.jpg$|&|' \
-s '|^.*/photo3\.jpg$|&|' \
-s '|^.*/redcar\.jpg$|&|' \
-s '|^.*/balloon2323\.jpg$|&|' \
-s '|.*||' ./ ../"${1##*/}.mirror"
cd - >/dev/null
... а потом вы прогнали его как...
. ./paxscript "$targetdir"
Он создал бы зеркало "$targetdir"
в своем родительском каталоге, содержащем только жесткие ссылки на имена файлов, которые вы хотите сопоставить. Затем вы можете проверить результаты по своему усмотрению, прежде чем делать rm -rf "$targetdir"
и избавиться только от всех нужных вам патнанов.
Я изменил разрешения на скрипт и скрипт: chmod u + x /path/to/script.sh
и смог выполнить скрипт. Я не уверен, что нужно было перейти к пользователю root, но я поменял рут на протяжении всего процесса