Я изо всех сил пытаюсь понять это поведение:
Поведение скрипта: чтение файла (с датами); распечатайте список файлов в многоуровневом дереве каталогов и получите их размер, напечатайте только размер файла (будущий шаг: суммируйте общий размер файла).
Начальный скрипт:
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | head"
2000-03:
1000 /folder/2000-03balbasldas
2000-04:
12300 /folder/2000-04asdwqdas
[and so on]
Но когда я пытаюсь фильтровать через awk первое поле, я все равно получаю всю строку
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print $1}'"
2000-03:
1000 /folder/2000-03balbasldas
2000-04:
12300 /folder/2000-04asdwqdas
Я уже подошел к нему через split-et-impera, и следующая команда работает просто отлично :
du -d 2 "/folder/" | grep '2000-03' | awk '{print $1}'
1000
Боюсь, что мне не хватает чего-то очень тривиального, но я пока ничего не нашел.
Любая идея? Благодарность!
Ввод : каталог, содержащий папки с именем YYYY-MM-random_data и файл, содержащий строки:
ls -l
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-03-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-04-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-05-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablb
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablc
[...]
cat dates
2000-03
2000-04
2000-05
[...]
Ожидаемый результат: сумма дискового пространства, занимаемого всеми файлами, содержащимися в папке, имя которой включает строку в файле даты
2000-03: 1000
2000-04: 2123
2000-05: 1222112
[...]
====== Но, в частности, меня интересует, почему awk не может получить столбец $ 1, о котором я его просил.
2 ответа
Хорошо, кажется, я нашел ответ сам после многих исследований: D Я опубликую его здесь, надеясь, что это поможет кому-то еще.
Хитрость заключалась в том, чтобы избежать знака $ .
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print \$1}'"
Используя GNU Parallel это выглядит так:
parallel --tag "eval du -s folder/{}* | perl -ne '"'$s+=$_ ; END {print "$s\n"}'"'" :::: dates
--tag
добавляет в строку строку с датой.
{}
заменяется датой.
eval du -s folder/{}*
находит все папки, начиная с даты, и дает общее количество du
из этих папок.
perl -ne '$s+=$_ ; END {print "$s\n"}'
суммирует выходные данные du
Наконец, есть небольшая хитрость в цитировании, чтобы правильно ее процитировать.
Похожие вопросы
Новые вопросы
shell
Термин «оболочка» относится к общему классу текстовых интерактивных командных интерпретаторов, чаще всего связанных с операционными системами Unix и Linux. Для вопросов о сценариях оболочки, пожалуйста, используйте более конкретные теги, такие как 'bash', 'powershell' или 'ksh'. Без конкретного тега следует предполагать переносимое (POSIX-совместимое) решение, хотя вместо него предпочтительнее использовать «posix» или «sh».