В первом случае:
права доступа предотвращают расширение оболочки (*)/var/solr/data/new_core/_default/*
, когда вы centos
.
расширяется, а затем как /var/solr/data/new_core/_default/*
в первом случае.
в /var/solr/data/new_core/_default/
нет *
файла или каталога, поэтому no match found
.
Во втором случае ls находит файлы и перечисляет их.
(*)это Filename Expansion
из расширения zsh (см.man zshexpn
).
FILENAME GENERATION
If a word contains an unquoted instance of one of the characters `*',...
The word is replaced with a list of sorted filenames that match the pattern.
как и вы centos
до sudo
zsh не может получить доступ к каталогу (, например. файл conf
), отсюда и no match found
.
Использование оболочки zsh
:
counter=0
for name in $HOME/folder/*(.NDOm); do
counter=$(( counter + 1 ))
suffix=$name:e
printf -v newname '%s/object%.3d%s' $name:h $counter ${suffix:+.$suffix}
mv $name $newname
done
Это перебирает все имена обычных файлов в каталоге ~/folder
, от самых старых до самых новых по отметке времени последнего -изменения. Для каждого имени создается новое имя с использованием части каталога текущего имени и счетчика. Файлы переименовываются в эти новые имена (без подтверждения и без проверки на конфликты имен ).
Вызов printf -v newname
"выводит" свой вывод в переменную newname
. Строка формата %.3d
выводит заполненное нулем целое число -в трех позициях (, например. 001
, 023
, 109
и т. д. )Расширение параметра $name:h
будет расширяться до части заголовка/каталога пути $name
(это то же самое, что иdirname "$name"
).
$name:e
будет расширяться до «расширения» исходного имени файла (, например. foo
, если текущий файл — apple.foo
), и мы сохраняем его в suffix
. С помощью ${suffix:+.$suffix}
мы добавляем точку к расширению имени файла, если оно есть.
.
в (.NDOm)
в конце шаблона подстановки имени файла является квалификатором подстановки, который заставляет предыдущий шаблон подстановки соответствовать только обычным файлам. N
и D
заставляют шаблон действовать так, как если бы nullglob
и dotglob
в оболочке bash
были установлены (расширяться до нуля, если совпадений нет, и включать скрытые имена в результат ). Om
упорядочивает совпадающие имена таким образом, чтобы самый старый (наименее измененный )файл сортировался первым.
Если zsh
не является вашей оболочкой входа в систему, то ее можно запустить как сценарий.
$ zsh./this-script
Предполагая, что имена файлов не содержат пробелов, табуляции или новой строки, использование одного вкладыша -и bash
и awk
было бы простым:
ls -rt | awk -F "." '{print $0 " object" sprintf("%03d",NR) "." $NF }' | xargs -L 1 mv
Команда xargs -l
выполняет mv
для каждой строки. Перед выполнением команды выполните следующую команду и проверьте правильность имен целевого и исходного файлов:
ls -rt | awk -F "." '{print $0 " object" sprintf("%03d",NR) "." $NF }'
должен вывести что-то вроде:
melon.foo object001.foo
cookie.foo object002.foo
pie.foo object003.foo
apple.foo object004.foo
Вот версия, написанная на bash
с утилитами GNU, которая не требует синтаксического анализа ls
и будет обрабатывать любые файлы с юридическими именами (, встроенные пробелы, знаки препинания, новые строки и т. д.)
#!/bin/bash
k=0 # start at the beginning
find *.foo -type f -printf "%T@ %p\0" | # list all the files with modification time
sort -z | # sort by increasing modification time
cut -z -d' ' -f2- | # discard the time value leaving just the name
while IFS= read -r -d '' file # now loop for each file...
do
((++k)) # next count
seq=$(printf "%03d" $k) # format the three-digit counter
name="${file%.*}" ext="${file##*.}" # split filename into name and extension
echo will mv "$file" "$name.$seq.$ext" # show what would happen without doing it
done
Удалите echo will
, когда будете готовы к выполнению команды mv
.
Пример
# preparation
for f in {melon,cookie,pie,apple}.foo; do touch "$f"; sleep 1; done
# list in order of modification time (oldest to newest)
ls -tr
melon.foo cookie.foo pie.foo apple.foo
# run the script and observe the output
k=0; find *.foo -type f -printf "%T@ %p\0" | sort -z | cut -z -d' ' -f2- | while IFS= read -r -d '' file; do ((++k)); seq=$(printf "%03d" $k); name="${file%.*}" ext="${file##*.}"; echo mv "$file" "$name.$seq.$ext"; done
will mv melon.foo melon.001.foo
will mv cookie.foo cookie.002.foo
will mv pie.foo pie.003.foo
will mv apple.foo apple.004.foo