Используя результат команды в качестве аргумента в bash? - PullRequest
58 голосов
/ 12 сентября 2008

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

ls > list.txt

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

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

ls > ${pwd}.txt

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

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

Ответы [ 7 ]

73 голосов
/ 12 сентября 2008

Лучший способ сделать это с "$(command substitution)" (спасибо, Landon ):

ls > "$(pwd).txt"

Иногда вы также можете увидеть, как люди используют более старую нотацию обратного кавычка, но это имеет несколько недостатков с точки зрения вложения и экранирования:

ls > "`pwd`.txt"

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

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

Также спасибо erichui за постановку проблемы пробелов на пути.

6 голосов
/ 12 сентября 2008

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

ls > $(pwd).txt
6 голосов
/ 12 сентября 2008

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

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», например, для хранения данных дорожек в некоторых запасных файлах (в основном я «скрываю» метаданные таким образом). Это работает хорошо, потому что мои потребности просты, а моя коллекция мала.

5 голосов
/ 12 сентября 2008

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

ls > "$(pwd).txt"

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

4 голосов
/ 12 сентября 2008

Синтаксис:

ls > `pwd`.txt

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

1 голос
/ 12 сентября 2008

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

#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt
0 голосов
/ 06 марта 2012

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

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
...