Я изо всех сил пытаюсь понять это поведение:

Поведение скрипта: чтение файла (с датами); распечатайте список файлов в многоуровневом дереве каталогов и получите их размер, напечатайте только размер файла (будущий шаг: суммируйте общий размер файла).

Начальный скрипт:

 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, о котором я его просил.

1
Rob013 24 Апр 2017 в 11:16

2 ответа

Лучший ответ

Хорошо, кажется, я нашел ответ сам после многих исследований: D Я опубликую его здесь, надеясь, что это поможет кому-то еще.

https://unix.stackexchange.com/questions/282503/right-syntax-for-awk-usage-in-combination-with-other-command-inside-xargs-sh-c

Хитрость заключалась в том, чтобы избежать знака $ .

 cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print \$1}'"
1
Rob013 24 Апр 2017 в 10:32

Используя 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

Наконец, есть небольшая хитрость в цитировании, чтобы правильно ее процитировать.

0
Ole Tange 1 Май 2017 в 21:56
43583016