Pergunta

Para criar uma lista de reprodução para todas as músicas de uma pasta, estou usando o seguinte comando no bash:

ls > list.txt

Eu gostaria de usar o resultado do senha (imprimir diretório de trabalho) comando para o nome da lista de reprodução.

Algo como:

ls > ${pwd}.txt

Mas isso não funciona - alguém pode me dizer qual sintaxe preciso usar para fazer algo assim?

Editar: Como mencionado nos comentários, o pwd acabará fornecendo um caminho absoluto, então minha playlist acabará sendo nomeada .txt em algum diretório - d'oh!Então terei que cortar o caminho.Obrigado por perceber isso - eu provavelmente teria passado muito tempo me perguntando para onde foram meus arquivos!

Foi útil?

Solução

A melhor maneira de fazer isso é com "$(command substitution)" (obrigado, Landon):

ls > "$(pwd).txt"

Às vezes, você também verá pessoas usando a notação de crase mais antiga, mas isso tem várias desvantagens em termos de aninhamento e fuga:

ls > "`pwd`.txt"

Observe que a substituição não processada de pwd é um caminho absoluto, então o comando acima cria um arquivo com o mesmo nome no mesmo diretório do diretório de trabalho, mas com um .txt extensão.Thomas Kammeyer destacou que o basename O comando remove o diretório principal, então isso criaria um arquivo de texto no diretório atual com o nome desse diretório:

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

Agradeço também ao erichui por trazer à tona o problema dos espaços no caminho.

Outras dicas

Isso é equivalente à solução backtick:

ls > $(pwd).txt

Para fazer literalmente o que você disse, você poderia tentar:

ls > `pwd`.txt

que usará o nome do caminho completo, o que deve servir.Observe que, se você fizer isso no seu diretório inicial, que pode estar em /home /hoboben, você estará tentando criar /home/hoboben.txt, um arquivo de texto no diretório acima.

É isto o que você queria?

Se você quisesse que o diretório contenha um arquivo com o nome dele, obteria o nome da base do diretório atual e anexaria isso com .txt ao PWD.

Agora, em vez de usar o comando pwd...por que não usar a variável de ambiente PWD?

Por exemplo:

ls > $PWD.txt

ou

ls > ${PWD}.txt

é provavelmente o que você estava tentando lembrar com seu segundo exemplo.

Se você estiver em /home/hoboben e quiser criar /home/hoboben/hoboben.txt, tente:

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

Se você fizer isso, o arquivo conterá seu próprio nome; portanto, na maioria das vezes, você poderá remediar isso de algumas maneiras.Você pode redirecionar para outro lugar e mover o arquivo ou nomeá-lo começando com um ponto para ocultá-lo do comando ls, desde que não use o sinalizador -a (e, opcionalmente, renomeie o arquivo resultante).

Eu escrevo meus próprios scripts para gerenciar uma hierarquia de diretórios de arquivos de música e uso subdiretórios chamados ".info", por exemplo, para conter dados de faixas em alguns arquivos sobressalentes (basicamente, eu "escondo" metadados dessa forma).Funciona bem porque minhas necessidades são simples e minha coleção pequena.

Suspeito que o problema seja a existência de espaços em um dos nomes de diretório.Por exemplo, se o seu diretório de trabalho for "/home/user/music/artist name".Bash ficará confuso pensando que você está tentando redirecionar para /home/user/music/artist e name.txt.Você pode corrigir isso com aspas duplas

ls > "$(pwd).txt"

Além disso, você pode não querer redirecionar para $(pwd).txt.No exemplo acima, você redirecionaria a saída para o arquivo "/home/user/music/artist name.txt"

A sintaxe é:

ls > `pwd`.txt

Esse é o caractere '`' abaixo de '~', não a aspa simples normal.

Usar o método acima criará os arquivos um nível acima do diretório atual.Se você quiser que todas as listas de reprodução vão para um diretório, você precisará fazer algo como:

#!/bin/sh

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

para remover tudo, exceto o nome do diretório

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

provavelmente não é isso que você deseja, porque você não sabe onde estão os arquivos (a menos que altere o comando ls)

para substituir "/" por "_"

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

mas a lista de reprodução ficaria feia e talvez nem coubesse na janela de seleção

Portanto, isso lhe dará um nome curto e legível e caminhos utilizáveis ​​​​dentro do arquivo

ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top