Размер файла в цикле for

Из вашего случая я понял, что вам нужно скопировать файлы с этим шаблоном в соответствующую папку на основе отметки времени в имени файла.

для этого вы можете просто выполнить итерацию по ним и переместить каждый файл в соответствующий каталог:

for i in [[:digit:]]*-NEW.XML; do  dirname="${i%6:6}"; mv $i $dirname; done;

p.s цикл здесь будет выполнять итерацию только для файлов, соответствующих переданному регулярному выражению .

1
26.07.2015, 23:37
1 ответ

Вы не даете любой аргумент (имя файла) в 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
0
28.01.2020, 01:37

Теги

Похожие вопросы