Есть ли какая-нибудь команда для поиска в каталоге файлов и вывода результата в файл с префиксным текстом перед именем найденного файла?
Например, у меня есть каталог с этими файлами:
sound1
sound2
sound3
…
Затем дайте команду для поиска в каталоге и записи результатов в текстовый файл с префиксом перед ним, например
media sound1
media sound2
media sound3
…
Есть ли способ записать «media1», «media 2» и т. д. вместо «media» в существующий текстовый файл, не удаляя то, что было в этом текстовом файле раньше?
media1 sound1
media2 sound2
media3 sound3
…
Как насчет простого цикла for?
for i in *; do echo media $i >> text_file; done
$ 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"
$ 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
Попробуйте этот скрипт:
#!/bin/bash
dir=`find /home/username/ -name script_test`
ls $dir > test.txt
sed -i -e 's/^/media /' test.txt
Это должно помочь:
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': Отформатируйте имя файла с префиксом носителя.
> file.txt: Отправьте его в файл с именем file.txt.
Вы можете использовать команду find следующим образом:
find . ! -name 'sound.txt' -type f -exec sh -c 'echo "media $(basename {}) "' \; > sound.txt
Объяснение:
Первый аргумент - это путь к каталогу, в примере это текущий directory ., но вы можете изменить его на /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 будет перенаправлен.Обновление комментариев. В комментариях есть два предложения по упрощению приведенной выше команды:
Первым аргументом является путь к каталогу, в примере это текущий каталог ., но вы можете изменить это /any/desired/path/.Первый аргумент - это путь к каталогу, в примере это текущий каталог ., но вы можете изменить его на /any/desired/path/.
find . ! -name 'sound.txt' -type f -exec sh -c 'echo media ${0##*/}' {} \;
! -name 'sound.txt' - означает, что элементы с именем sound.txt будут опущены. Десерт:
$ 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
Выходы каждой из приведенных выше команд будут идентичны друг другу:
Первым аргументом является путь к каталогу, в примере это текущий каталог ., но вы можете изменить его на /any/desired/path/ .
find . ! -name 'sound.txt' -type f -exec sh -c 'echo media ${0##*/}' {} \;
! -name 'sound.txt' - означает, что элементы с именем sound.txt будут опущены.
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
Или мы можем использовать этот более простой синтаксис: [f1 0] Пример вывода этой команды будет: $ 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
-type f - означает, что будут найдены только файлы. Сначала распечатайте список файлов (одна запись в строке) в файле (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
Теперь будет добавлен фиксированный префикс (media) к каждой строке, как до
sed -i 's/^/media/' list_of_files
. Окончательный выход будет
media1 sound1
media2 sound2
...
Как насчет простого цикла for?
for i in *; do echo media $i >> text_file; done
$ 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"
$ 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
Попробуйте этот скрипт:
#!/bin/bash
dir=`find /home/username/ -name script_test`
ls $dir > test.txt
sed -i -e 's/^/media /' test.txt
Это должно помочь:
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': Отформатируйте имя файла с префиксом носителя.
> file.txt: Отправьте его в файл с именем file.txt.
Вы можете использовать команду find следующим образом:
find . ! -name 'sound.txt' -type f -exec sh -c 'echo "media $(basename {}) "' \; > sound.txt
Объяснение:
Первый аргумент - это путь к каталогу, в примере это текущий directory ., но вы можете изменить его на /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 будет перенаправлен.Обновление комментариев. В комментариях есть два предложения по упрощению приведенной выше команды:
Первым аргументом является путь к каталогу, в примере это текущий каталог ., но вы можете изменить это /any/desired/path/.Первый аргумент - это путь к каталогу, в примере это текущий каталог ., но вы можете изменить его на /any/desired/path/.
find . ! -name 'sound.txt' -type f -exec sh -c 'echo media ${0##*/}' {} \;
! -name 'sound.txt' - означает, что элементы с именем sound.txt будут опущены. Десерт:
$ 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
Выходы каждой из приведенных выше команд будут идентичны друг другу:
Первым аргументом является путь к каталогу, в примере это текущий каталог ., но вы можете изменить его на /any/desired/path/ .
find . ! -name 'sound.txt' -type f -exec sh -c 'echo media ${0##*/}' {} \;
! -name 'sound.txt' - означает, что элементы с именем sound.txt будут опущены.
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
Или мы можем использовать этот более простой синтаксис: [f1 0] Пример вывода этой команды будет: $ 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
-type f - означает, что будут найдены только файлы. Сначала распечатайте список файлов (одна запись в строке) в файле (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
Теперь будет добавлен фиксированный префикс (media) к каждой строке, как до
sed -i 's/^/media/' list_of_files
. Окончательный выход будет
media1 sound1
media2 sound2
...