Ищите каталог файлы и произведите результат к текстовому файлу

Там некоторая команда должна искать каталог файлы и производить результат в файл с текстом префикса перед названием файла, который был найден?

Например, у меня есть каталог с этими файлами:

sound1
sound2
sound3 
…

Затем дайте команду, чтобы искать каталог и записать результаты в текстовый файл с префиксом перед ним, например.

media sound1
media sound2
media sound3
…

Вопрос о премии

Существует ли способ записать "media1", "медиа 2" и т.д.... вместо просто "медиа" в файл существующего текста, не удаляя, что было в том текстовом файле прежде?

media1 sound1
media2 sound2
media3 sound3
…
5
задан 29 September 2017 в 05:28

5 ответов

Это что-то для помощи:

find /path/to/sound/files -type f -name "sound[0-9]" -printf 'media %f\n' > file.txt

информация:

sound[0-9]: Ищите файл с именами, которые имеют sound и концы с номером

-printf 'media %f\n': Отформатируйте filesname с префиксом медиа.

> file.txt: Отправьте его для регистрации названный file.txt.

3
ответ дан 23 November 2019 в 08:47

Сначала распечатайте список файлов (одна запись на строку) в файле (list_of_files)

ls -1 /location/of/the/directory > list_of_files

Затем добавляют фиксированное префикс (media) к каждой строке

sed -i 's/^/media /' list_of_files

Обновление для вопроса о премии

Для добавления, нумерация, сначала для печати списка файлов в файле (скажите list_of_files), как прежде. Затем добавьте номера строки перед каждой строкой

sed -i '=' list_of_files

, вывод был бы похож, это

1
sound1
2
sound2
...

Затем фиксирует разрывы строки

sed -i '{N;s/\n/ /}' list_of_files

, вывод был бы теперь похож, это

1 sound1
2 sound2
...

Затем наконец добавляет фиксированное префикс (media) к каждой строке как прежде

sed -i 's/^/media/' list_of_files

, Окончательный результат был бы

media1 sound1
media2 sound2
...
2
ответ дан 23 November 2019 в 08:47

Попробуйте этот сценарий:

#!/bin/bash
dir=`find /home/username/ -name script_test`
ls $dir  > test.txt
sed -i -e 's/^/media /' test.txt
0
ответ дан 23 November 2019 в 08:47

Как насчет простого for цикл?

for i in *; do echo media $i >> text_file; done

Объяснения

  • * – расширяется до каждого файла в текущем каталоге
  • echo media $i – печать “медиа” и в настоящее время обрабатываемое имя файла
  • >> text_file – перенаправляет вывод echo в названный файл text_file добавление его

Пример

$ ls
sound1  sound2  sound3

$ for i in *; do echo media $i >> text_file; done

$ cat text_file 
media sound1
media sound2
media sound3

Вопрос о премии

k=0; for i in *; do ((k++)); echo media$k $i >> text_file; done

Или для очень многих файлов (немного быстрее):

j=text_file; k=0; for i in *; do if [[ "$i" != "$j" ]]; then ((k++)); echo media$k $i; fi; done > "$j"

Объяснения

  • k=0 – определите переменную k и набор это к 0
  • ((k++)) – инкремент $k одним

Пример

$ ls
sound1  sound2  sound3

$ k=0; for i in *; do ((k++)); echo media$k $i >> text_file; done

$ cat text_file 
media1 sound1
media2 sound2
media3 sound3
3
ответ дан 23 November 2019 в 08:47

Можно использовать find команда таким образом:

find . ! -name 'sound.txt' -type f -exec sh -c 'echo "media $(basename {}) "' \; > sound.txt

Объяснение:

  • Первым аргументом является путь к каталогу, в примере это - текущий каталог ., но можно изменить его на /any/desired/path/.

  • ! -name 'sound.txt' - средства это объекты с именем sound.txt будет опущен.

  • -type f - средства только файлы будут находить.

  • -exec <command> \; - сообщите find команда для выполнения <command>.

  • {} выходной аргумент от всей команды прежде -exec - find . ! -name 'sound.txt' -type f.

  • sh -c 'echo "media $(basename {}) "' <command> это будет выполняться:

    • sh -c - выполните команду в /bin/sh оболочка;
    • 'echo "media $(basename {}) "' - команда, которая будет выполняться:
    • echo "<something>" - вывод <something> к STDOUT;
    • media - просто строка;
    • $(<some command>) - рассматривайте результат <some command> как строка;
    • basename {} - распечатайте только имя файла без его пути, где {} переменная, которая содержит полное имя файла, сгенерированное find . ! -name 'sound.txt' -type f
  • Наконец > перенаправления STDOUT;

  • sound.txt название файла, где STDOUT будет перенаправлен.

Обновление из комментариев. В рамках комментариев существует два предложения для упрощения вышеупомянутой команды:

  • Начальная команда:

    find . ! -name 'sound.txt' -type f -exec sh -c 'echo "media $(basename {}) "' \;
    
  • Предложение десерта:

    find . ! -name 'sound.txt' -type f -exec sh -c 'echo media ${0##*/}' {} \;
    
  • Предложение Steeldriver:

    find . ! -name 'sound.txt' -type f -printf 'media %f\n'
    

Пример использования. Давайте предположим, что у нас есть каталог со следующей структурой:

$ tree .
.
├── sound
├── sound1
├── sound2
├── sound3
├── sound4
├── sound5
├── sound99
└── soundd

Выводы каждой вышеупомянутой команды будут идентичны друг друга:

$ find . ! -name 'sound.txt' -type f -printf 'media %f\n'
media sound1
media soundd
media sound3
media sound5
media sound2
media sound
media sound99
media sound4

Вопрос о премии. Согласно вопросу о премии, find команда не является лучшим выбором, но его вывод мог быть передан по каналу (|) к другой команде или циклу. И вот два случая:

  • Первый случай - когда мы хотим просто рассчитать media# результаты:

    find . ! -name 'sound.txt' -type f -printf 'media %f\n' | sort | \
    while read -r i; do \
        count=$((count+1)); \
        echo $i | sed "s/media/media$count/"; \
    done
    

    Вывод в качестве примера этой команды будет:

    $ find . ! -name 'sound.txt' -type f -printf 'media %f\n' | sort | while read -r i; do count=$((count+1)); echo $i | sed "s/media/media$count/"; done
    media1 sound
    media2 sound1
    media3 sound2
    media4 sound3
    media5 sound4
    media6 sound5
    media7 sound99
    media8 soundd
    
  • Другой случай - когда мы хотим присвоить номер каждого sound# файл к media префикс. И потому что в обстоятельства примера имеет два файла без любого числа в их именах (sound, soundd), мы добавим уникальное число к ним, таким образом, префикс будет media/#:

    find . ! -name 'sound.txt' -type f -printf 'media %f\n' | sort | \
    while read -r i; do \
        number=$(echo $i | grep -Eo '[0-9]+'); \
        if [ -z $number ]; then \
            count=$((count+1));
            number="\/$count"; \
        fi; \
        echo $i | sed "s/media/media$number\t/"; \
    done
    

    Или мы можем использовать этот более простой синтаксис:

    find . ! -name 'sound.txt' -type f -printf 'media %f\n' | sort  | \
    while read -r i; do \
        number=$(echo $i | grep -Eo '[0-9]+'); \
        [ -z $number ] && count=$((count+1)) && number="\/$count"; \
        echo $i | sed "s/media/media$number\t/"; 
    done
    

    Вывод в качестве примера этой команды будет:

    $ find . ! -name 'sound.txt' -type f -printf 'media %f\n' | sort | while read -r i; do number=$(echo $i | grep -Eo '[0-9]{1,99}'); [ -z $number ] && count=$((count+1)) && number="\/$count"; echo $i | sed "s/media/media$number\t/"; done
    media/1  sound
    media1   sound1
    media2   sound2
    media3   sound3
    media4   sound4
    media5   sound5
    media99  sound99
    media/2  soundd
    
  • Подсказки:

3
ответ дан 23 November 2019 в 08:47

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

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