Вы также можете использовать find и grep с обратными кавычками для выбора файлов для команды move. Передайте их в mv.
Например, для скрытых файлов
find Foo -maxdepth 1 | egrep '^Foo/[.]' # Output: .hidden
So
mv `find Foo -maxdepth 1 | egrep '^Foo/[.]'` Bar # mv Foo/.hidden Bar
Перемещает только выбранные скрытые файлы в Bar
:
mv `find Foo -maxdepth 1 | egrep '^Foo/.'` Bar # mv Foo/.hidden Foo/notHidden Bar
Перемещает все файлы в Foo в Bar, поскольку символ '.' в команде egrep действует как подстановочный знак без квадратных скобок.
Символ ^
гарантирует, что совпадение начинается с начала строки.
Некоторые подробности о egrep
сопоставлении шаблонов можно найти здесь.
Использование maxdepth 1
останавливает find от перехода в подкаталоги.
Нет необходимости в том, чтобы это разрешалось; ему просто все равно, на что указывает символическая ссылка, даже на несуществующий -путь (или на саму символическую ссылку ).
Можно было бы запретить создание символической ссылки на несуществующий путь, но возникло бы несколько проблем:
Если у вас есть символическая ссылка, указывающая на несуществующий путь, вы можете переименовать символическую ссылку так, чтобы она указывала сама на себя. Итак, если вы хотите запретить символические ссылки, указывающие на самих себя, вам нужно будет ограничить переименование.
Символические ссылки могут быть чем угодно, потому что символ может представлять любое количество вещей для любого количества программ/ОС/людей. Подобно символам в физическом мире, символ можно сделать из чего угодно и для чего угодно. Нет необходимости в проверке, так как цель уже существует в системе, и пользователь в любом случае будет иметь к ней доступ через свои привилегии.
Если вы действительно хотите, чтобы это поведение прекратилось. Вы можете создать сценарий, чтобы проверить, будет ли он указывать на себя, и вернуть ошибку, если это так, и создать ссылку, если это не так. После создания скрипта вы можете создать псевдоним для ln, указывающий на ваш скрипт.
Может выглядеть примерно так:
#!/bin/bash
if [ "$1" == "$2" ]
then
echo "ERROR pointing to self!"
else
ln "$1" "$2"
fi