Любой простой способ сделать для канала цикла, такой как 'ls | grep “.*.7z” | 7z-e {}'

Я думаю, что большая вещь заключается в том, что конкретный> неопределенный. Инструменты, такие как сбор урожая и такие, которые помогают пользователям находить определенные предметы для работы, помогут увеличить участие и работу. Мне бы хотелось увидеть каждую область (упаковку, ошибки, документы), чтобы кто-то из команды работал над списком «todo», который они хотели бы увидеть, чтобы сделать Jam. Таким образом, участники и потенциальные участники могут пройти через список и, надеюсь, получить более полезные конкретные достижения. Я знаю, что наш Джем очень расплывчатый. «Давайте все собираемся вместе, будем пиццу и найдем что-то делать». Я уверен, что много времени не будет очень хорошим продуктом, пока нам будет интересно:)

1
задан 19 March 2020 в 04:51

2 ответа

Я не уверен, что это - прямой ответ на вопрос (существует намного больше чем один вопрос), но я думаю, что Вы просите что-то как:

  • for цикл с заменой команды или
  • while цикл с заменой процесса.


for цикл с $(command substitution)

Замена команды позволяет выводу команды заменять саму команду. Мы можем объединить эту функциональность с for цикл таким образом:

for item in "$(find . -type f)"
do
    echo "$item" | tee -a ./"file-list.txt"
done


while цикл с <(process substitution)

Замена процесса позволяет вводу или выводу процесса быть отнесенным в использование имени файла. Мы можем объединить эту функциональность с while цикл, справкой встроенного read, таким образом:

while IFS= read -r item
do
    echo "$item" | tee -a ./"file-list.txt"
done < <(find . -type f)

В заключительной части < <(find . -type f), первое < означает stdin в то время как loop и <(find . -type f) будет рассматриваться как файл. Больше о конструкции IFS= read -r line можно читать в этом большом сообщении Stéphane Chazelas.

Можно достигнуть того же как вышеупомянутого при помощи канала вместо замены процесса (но эта опция не предпочтена, потому что это могло вызвать ошибки):

find . -type f | while IFS= read -r file
do
    echo "$file" | tee -a ./"file-list.txt"
done


Передайте вывод по каналу цикла к другой команде

Далее мы можем передать по каналу или перенаправить вывод цикла к другой команде или функции:

while IFS= read -r -d '' item; do
    # Compose the name of the new file
    DIR="$(dirname "${item}")"
    FILE_NAME="$(basename "${item}")"
    NEW_FILE_NAME="new-${FILE_NAME}"

    # move the file and suppress the potential output 
    # of the 'mv' command by redirecting it to a log file 
    mv "${item}" "${DIR}/${NEW_FILE_NAME}" >>/tmp/mv-loop.log 2>&1

    # output the name of the new file in order to be processed 
    # by the next (piped) command
    printf '%b' "${DIR}/${NEW_FILE_NAME}"'\0'
done < <(find . -type f -print0) | xargs -0 -I{} 7z a -t7z "the_archive_name.7z" {}

Отметьте в вышеупомянутом примере, пустые разделители используются везде:

  • find . -print0,
  • IFS= read -r -d '' item - ссылка,
  • printf '%b' a'\0'b - ссылка,
  • xargs -0 (в этом случае нам на самом деле не нужно -I{} и {} в xargs команда).

Этот пример переместится (переименовывают) все файлы рекурсивно, но в архиве появляется привычка структуры каталогов.

2
ответ дан 7 April 2020 в 23:33

Есть ли простой и распространенный способ сделать

Ответ: Нет, каждая команда отличается.


Относительно Ваших вопросов:

  1. Вам не нужно -t, но затем mv будет работать за каждым файлом, который будет намного медленнее. Необходимо закончить Ваш -exec с \; вместо +.

  2. Канал не имеет никакого отношения к a for цикл, канал отправляет stdout от левой стороны канала к stdin на правой стороне. xargs чтения от stdin (или из файла с -a опция) и выполнения команда с аргументами, взятыми от входа.

  3. ls имеет нет -exec опция. ls будет работать с xargs, но не с xargs -0 потому что ls не имеет никакой опции для разграниченного вывода ПУСТОГО УКАЗАТЕЛЯ. Это также, почему Вы не должны использовать ls с каналами вообще (именам файлов позволяют иметь новые строки).

  4. Для mv, -t целевой каталог, в то время как для 7z это - тип архивирования, почему Вы думаете, что это должно работать?

Для меня кажется использованием команд, которые Вы действительно не понимаете. Это не будет работать ни на какой язык программирования или язык сценариев.


Btw: необходимо использовать xargs с -r опция избежать проблем с пустым входом.

1
ответ дан 7 April 2020 в 23:33

Другие вопросы по тегам:

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