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

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

ls > list.txt

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

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

ls > ${pwd}.txt

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

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

Ответ 1

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

ls > "`pwd`.txt"

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

ls > "$(pwd).txt"

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

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

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

Ответ 2

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

ls > `pwd`.txt

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

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

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

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

Например:

ls > $PWD.txt

или

ls > ${PWD}.txt

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

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

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

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

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

Ответ 3

Это эквивалентно решению backtick:

ls > $(pwd).txt

Ответ 4

Я подозреваю, что проблема может заключаться в том, что в одном из имен каталогов есть пробелы. Например, если ваш рабочий каталог "/home/user/music/artist name". Bash будет путать, думая, что вы пытаетесь перенаправить на /home/user/music/artist и name.txt. Вы можете исправить это с помощью двойных кавычек

ls > "$(pwd).txt"

Кроме того, вы не можете перенаправлять файл $(pwd).txt. В приведенном выше примере вы будете перенаправлять вывод в файл "/home/user/music/artist name.txt"

Ответ 5

Синтаксис:

ls > `pwd`.txt

Это символ `` 'под "~", а не обычная одинарная кавычка.

Ответ 6

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

#!/bin/sh

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

Ответ 7

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

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