Из вашего случая я понял, что вам нужно скопировать файлы с этим шаблоном в соответствующую папку на основе отметки времени в имени файла.
для этого вы можете просто выполнить итерацию по ним и переместить каждый файл в соответствующий каталог:
for i in [[:digit:]]*-NEW.XML; do dirname="${i%6:6}"; mv $i $dirname; done;
p.s цикл здесь будет выполнять итерацию только для файлов, соответствующих переданному регулярному выражению .
Вы не даете любой аргумент (имя файла) в stat
, приводящий к этой ошибке.
Вы используете переменную файл
для хранения каждого имени файла и перебираете их, но вы не указываете имена файлов в качестве аргументов для stat
. Вкратце, вам нужно передать $ file
(значение переменной file
) в stat
.
Также вы можете делать все, что делаете, в одной строке:
for file in .* *; do stat -c '%s-%n' "$file" ; done
Если вы настаиваете на выводе в формате printf
, вам понадобится дополнительный \ n
:
for file in .* *; do stat --printf='%s-%n\n' "$file" ; done
Здесь i также добавили % n
, чтобы вы могли узнать, какой размер файла отображается.
РЕДАКТИРОВАТЬ:
Если вы хотите запустить это только для файлов, за исключением каталогов, вам необходимо использовать дополнительную проверку. Здесь я использовал встроенную функцию test
( [
), чтобы проверить, является ли файл
обычным файлом, если да, то есть [-f "$ file"]
возвращает код выхода 0, затем ( &&
) запускает stat
в файле:
for file in .* *; do [ -f "$file" ] && stat -c '%s-%n' "$file" ; done