コマンドの結果を bash の引数として使用しますか?
-
09-06-2019 - |
質問
フォルダー内のすべての音楽のプレイリストを作成するには、bash で次のコマンドを使用します。
ls > list.txt
の結果を活用したいと思います 障害者 (作業ディレクトリの印刷) プレイリストの名前を指定するコマンド。
何かのようなもの:
ls > ${pwd}.txt
しかし、それは機能しません - このようなことを行うにはどのような構文を使用する必要があるか誰か教えてもらえますか?
編集: コメントで述べたように、pwd は絶対パスを与えることになるので、私のプレイリストは最終的にディレクトリ内の .txt という名前になります。したがって、パスをトリミングする必要があります。見つけてくれてありがとう - 私だったら、おそらく自分のファイルがどこに行ったのか疑問に思って何年も費やしたでしょう。
解決
これを行う最良の方法は、 "$(command substitution)"
(ありがとう、 降下する):
ls > "$(pwd).txt"
古いバッククォート表記を使用している人も時々見かけますが、これは いくつかの欠点 ネストとエスケープの観点から:
ls > "`pwd`.txt"
の未処理の置換に注意してください。 pwd
は絶対パスであるため、上記のコマンドは作業ディレクトリと同じディレクトリに同じ名前のファイルを作成しますが、 .txt
拡大。トーマス・カマイヤーは次のように指摘した。 basename
コマンドは先頭のディレクトリを削除するため、現在のディレクトリにそのディレクトリの名前のテキスト ファイルが作成されます。
ls > "$(basename "$(pwd)").txt"
パス内のスペースの問題を提起してくれた erichui にも感謝します。
他のヒント
これはバッククォートの解決策と同等です。
ls > $(pwd).txt
あなたが言ったことを文字通りに実行するには、次のことを試すことができます:
ls > `pwd`.txt
これは完全なパス名を使用するので、問題ないはずです。/home /hobobenにある可能性のあるホームディレクトリでこれを行うと、上記のディレクトリのテキストファイルであるcreate /home/hoboben.txtを試すことに注意してください。
これがあなたが望んでいたものですか?
ディレクトリに名前の付いたファイルを含めることを望む場合、現在のディレクトリのベースネームを取得し、それをpwdに.txtで追加します。
ここでは、pwd コマンドを使用するのではなく...なぜ PWD 環境変数を使用しないのでしょうか?
例えば:
ls > $PWD.txt
または
ls > ${PWD}.txt
おそらく、2 番目の例で思い出そうとしたのはこれでしょう。
/home/hoboben にいて、/home/hoboben/hoboben.txt を作成したい場合は、次のことを試してください。
ls > ${PWD}/${PWD##*/}.txt
これを行うと、ファイルに独自の名前が含まれることになるため、ほとんどの場合、いくつかの方法のいずれかでこれを修正することになります。-a フラグを使用しない限り、別の場所にリダイレクトしてファイルを移動するか、ドットで始まるファイル名を付けて ls コマンドから非表示にすることができます (その後、必要に応じて結果のファイルの名前を変更します)。
私は音楽ファイルのディレクトリ階層を管理する独自のスクリプトを作成し、たとえば、いくつかの予備ファイルにトラック データを含めるために「.info」という名前のサブディレクトリを使用します (基本的に、この方法でメタデータを「非表示」にします)。私のニーズはシンプルで、コレクションは少ないので、これでうまくいきます。
問題は、ディレクトリ名のいずれかにスペースが含まれている可能性があると思われます。たとえば、作業ディレクトリが「/home/user/music/artist name」であるとします。Bash は、/home/user/music/artist と name.txt にリダイレクトしようとしていると考えて混乱するでしょう。これは二重引用符で修正できます
ls > "$(pwd).txt"
また、$(pwd).txt にリダイレクトしたくない場合もあります。上の例では、出力をファイル「/home/user/music/artist name.txt」にリダイレクトします。
構文は次のとおりです。
ls > `pwd`.txt
これは、通常の一重引用符ではなく、「~」の下にある「`」文字です。
上記の方法を使用すると、現在のディレクトリの 1 レベル上にファイルが作成されます。プレイリストをすべて 1 つのディレクトリに配置したい場合は、次のようなことを行う必要があります。
#!/bin/sh
MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.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