Там некоторая команда должна искать каталог файлы и производить результат в файл с текстом префикса перед названием файла, который был найден?
Например, у меня есть каталог с этими файлами:
sound1
sound2
sound3
…
Затем дайте команду, чтобы искать каталог и записать результаты в текстовый файл с префиксом перед ним, например.
media sound1
media sound2
media sound3
…
Существует ли способ записать "media1", "медиа 2" и т.д.... вместо просто "медиа" в файл существующего текста, не удаляя, что было в том текстовом файле прежде?
media1 sound1
media2 sound2
media3 sound3
…
Это что-то для помощи:
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.
Сначала распечатайте список файлов (одна запись на строку) в файле (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
...
Попробуйте этот сценарий:
#!/bin/bash
dir=`find /home/username/ -name script_test`
ls $dir > test.txt
sed -i -e 's/^/media /' test.txt
Как насчет простого 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
Можно использовать 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
Подсказки:
Можно скопировать и вставить много команду строки непосредственно к терминалу.
Не забывать > sound.text
в конец команды для продвижения вывода в файл.