Используя результат команды в качестве аргумента в 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