bash: вложенная подстановка присваивает переменной только последнее значение - PullRequest
2 голосов
/ 18 мая 2011
for f in $(for i in $(find Balzac/ -iname "20??????.txt"); do echo $i; done); do cat $f|cut -c 10-21; done|sort|uniq|egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3"

возвращает отсортированный, уникальный список всех mp3-файлов из списков воспроизведения на основе .txt, которые мы используем.

a=$(for f in $(for i in $(find Balzac/ -iname "20??????.txt"); do echo $i; done); do cat $f|cut -c 10-21; done|sort|uniq|egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3")

, но содержит только последнее значение этого списка.

Любая идея, почему и что я могу сделать, чтобы весь список в моей переменной?Я заблудился в этом ...

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

1 Ответ

1 голос
/ 18 мая 2011

Вы делаете это излишне сложным, перегружая операторов.Вы можете отложить это примерно на три уровня и при этом сохранить функциональность.

a=$(find Balzac/ -iname "20??????.txt" -exec cat {} + | cut -c 10-21 | sort | uniq | egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3")

На самом деле, я предполагаю, что следующая вещь, которую вы собираетесь сделать, - перебирать эти файлы.Если это так, вы можете пропустить присвоение переменной и сделать что-то читаемое, как это:

find Balzac/ -iname "20??????.txt" -exec cat {} + |
    cut -c 10-21 |
    sort | uniq |
    egrep -Re "[0-9][0-9][0-9]-[0-9][0-9][0-9].mp3" |
    while read file; do
        #Do something with $file
    done
...