bash - файл - linux перенаправление вывода в dev null




Используя результат команды в качестве аргумента в bash? (5)

Чтобы создать список воспроизведения для всей музыки в папке, я использую следующую команду в bash:

ls > list.txt

Я хотел бы использовать результат команды pwd (print working directory) для имени списка воспроизведения.

Что-то вроде:

ls > ${pwd}.txt

Это не работает - может ли кто-нибудь сказать мне, какой синтаксис мне нужно использовать, чтобы сделать что-то вроде этого?

Изменить: Как уже упоминалось в комментариях, pwd закончит тем, что даст абсолютный путь, поэтому мой плейлист будет называться .txt в каком-то каталоге - d'oh! Поэтому мне придется обрезать путь. Спасибо, что заметили это - я, наверное, потратил бы время на то, чтобы узнать, куда мои файлы пошли!


Используйте обратные шаги для замены результата команды:

ls > "`pwd`.txt"

Как указал Ландон, $(cmd) эквивалентен:

ls > "$(pwd).txt"

Обратите внимание, что необработанная подстановка pwd является абсолютным путем, поэтому приведенная выше команда создает файл с тем же именем в том же каталоге, что и рабочий каталог, но с расширением .txt . Томас Каммейер отметил, что команда basename разделяет ведущую директорию, поэтому это создаст текстовый файл в текущем каталоге с именем этого каталога:

ls > "`basename "$(pwd)"`.txt"

Также благодаря erichui для решения проблемы пробелов на пути.


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

#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt

Чтобы сделать буквально то, что вы сказали, вы можете попробовать:

ls > `pwd`.txt

который будет использовать полный путь, что должно быть хорошо. Обратите внимание: если вы сделаете это в своем домашнем каталоге, который может быть в / home / hoboben, вы будете пытаться создать /home/hoboben.txt текстовый файл в каталоге выше.

Это то, что вы хотели?

Если вы хотите, чтобы каталог содержал файл с именем после него, вы получили бы базовое имя текущего каталога и добавили его с .txt в pwd.

Теперь вместо использования команды pwd ... почему бы не использовать переменную среды PWD?

Например:

ls > $PWD.txt

или

ls > ${PWD}.txt

вероятно, вы пытались вспомнить со своим вторым примером.

Если вы находитесь в / home / hoboben и хотите создать /home/hoboben/hoboben.txt, попробуйте:

ls > ${PWD}/${PWD##*/}.txt

Если вы сделаете это, файл будет содержать свое имя, поэтому чаще всего вы исправляете это одним из нескольких способов. Вы можете перенаправить в другое место и перенести файл или называть файл, начинающийся с точки, чтобы скрыть его от команды ls, если вы не используете флаг -a (а затем, возможно, переименуете результирующий файл).

Я пишу свои собственные скрипты для управления иерархией каталогов музыкальных файлов, и я использую подкаталоги с именем «.info», например, для хранения данных треков в некоторых резервных файлах (в основном, я «скрываю» метаданные таким образом). Это работает хорошо, потому что мои потребности просты, а моя коллекция небольшая.


Это эквивалентно решению обратного хода:

ls > $(pwd).txt

убрать все, кроме имени каталога

ls >/playlistdir/${PWD##/*}.txt

это, вероятно, не то, что вы хотите, потому что тогда вы не знаете, где находятся файлы (если вы не измените команду ls)

заменить "/" на "_"

ls >/playlistdir/${PWD//\//_}.txt

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

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

ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt




command-line