Помимо жестких ссылок, индексный дескриптор файла гарантированно уникален в пределах одной файловой системы. Перебор файлов .JPG
в текущем каталоге и переименование ( mv
-ing) с помощью stat
для получения inode:
for i in *.JPG; do echo mv -- "$i" "$(stat -c '%i' "$i")"; done
echo
выдаст команду mv
, которая будет запущена. Удалите echo
для фактического действия:
for i in *.JPG; do mv -- "$i" "$(stat -c '%i' "$i")"; done
Кроме того, если вы хотите, чтобы окончательные имена файлов также имели расширение .JPG
:
for i in *.JPG; do mv -- "$i" "$(stat -c '%i' "$i").JPG"; done
У меня нет ответа на ваш основной вопрос, но мне стало интересно узнать о вашем втором вопросе «что я уже пробовал», и на данный момент это лучшее, что я могу сделать, чтобы заставить это работать с помощью одной команды, без подоболочки.:
IFS=: find_path=(${PATH}) && find "${find_path[@]}" <your_find_params>
Это уродливо и доказывает, что одна -команда/без -подоболочки, вероятно, не стоит затраченных усилий. В комментарии Стефана ниже вы можете вместо этого сделать что-то вроде
(IFS=:; set -f; find $PATH <your_find_params>)
Редактировать:Конечно, это не относится к случаю новой строки, встроенной в компонент пути, но кого это волнует... мы живем в реальном мире.:)
Будет
ls `echo $PATH | sed s@ @\\ @g | sed s@:@ @g` | grep [string]
выполнить то, что вам нужно, по обоим пунктам? sed s@ @\\ @g
следует заменить $PATH
записей, в которых есть пробелы, читаемым экранированным пробелом, а sed s@:@ @g
следует заменить двоеточия, разделяющие $PATH
записи, обычным пробелом, который позволяет ls
индивидуально отображать содержимое каждого каталога, который можно передать в grep
, который распознает поиск по регулярным выражениям, как подстановочные знаки, которые вы хотите использовать. Насколько я могу судить, это работает в родном Bash, но я не уверен, что это сработает в Cygwin's Bash.
Если это сработает, вы всегда можете присвоить ему псевдоним, чтобы он был менее громоздким в использовании.