
FLAC形式で抽出したアルバムでいっぱいのカタログがあります。 「アーティスト - アルバム[flac]」というフォルダ名が「アーティスト - アルバム[mp3]」である一致するディレクトリを作成する必要がありますが、特定のフォルダにのみ該当します。
だから"ls | grep Pantera"は私が使用したいディレクトリのリストを提供します...
コマンドラインでこれを行うにはどうすればよいですか?
答え1
xargsを使用すると、あるコマンドの出力を別のコマンドを実行するための引数として使用できますが、スペースや引用の問題のためにls
出力を使用することは非常に問題になります。提案を完了するには、生成された名前にスペースが含まれている場合は、次の手順を実行する必要があります。
ls | grep Pantera | sed -e 's/\[flac\]/[mp3]/' | xargs -n1 -i{} mkdir "{}"
しかし、はるかに良いこの目的のために、ツールはfind
コマンドと-exec
オプションを使用します。変数の代わりにリテラル文字列でbashの文字列関数を使用する方法や、1つのコマンドで変数を設定して使用する方法を知っていない場合は、次のものが必要です。ssapkotaの構文プロモーターシェル。
-type d
findを使用するときにディレクトリ一致(または-type f
ファイル)のみを返すなど、考慮する必要があるオプションもあります。-maxdepth 1
再帰照会を実行したい場合は、それを削除できます。パターンマッチングはシナリオに合わせて改善することもできます。
答え2
検索は最高のツールです。ただし、find
単一のコマンドのみが許可され、接続はサポートされていません。
以下は、一致するディレクトリ名ごとにサブシェルを分岐して機能するソリューションです。
find -maxdepth 1 -iname "*Pantera*" -exec \
bash -c ' name="{}" && mkdir "${name/flac/mp3}" ' \;
答え3
すべてのファイルが同じディレクトリにありますか?その後、単純なループとシェル文字列操作構成を使用できます。
for flac_dir in *Pantera*'[flac]'/; do
flac_dir=${flac_dir%/}
mp3_dir="${x%\[flac\]}[mp3]"
mkdir "$mp3_dir"
done
サブディレクトリ、zsh、またはbash≥4で繰り返し作業するには、for flac_dir in **/*Pantera*'[flac]'/
bashを使用してshopt -s globstar
最初に実行する必要があります。