私が望むのは、find
完全なパス名をタフに入力しなくても、パス名の結果を他のコマンドの引数として参照できることです。例:
$ find -name testfile
path1
path2
path3
$ cd path2
誰でもどのようにこれを行うことができますか?
ベストアンサー1
Bashでは、変数にファイルのフルパス値(/home/spider/src/myscript.pyなど)がある場合は、変数操作を使用してデフォルト名とディレクトリ名を取得できます。
たとえば、次のようになります。
filepath='/home/spider/src/myscript.py'
filename=${filepath##*/}
echo $filename
myscript.py
path=${filepath%/*}
echo $path
/home/spider/src
Bashには、-aオプションを使用してstdinから配列への読み取りをサポートする読み取りコマンドが組み込まれているため、次のことができます。
IFS='$\n' read -d '' -a files < <(find . -name testfile -type f)
シェル配列変数には、すべてのファイルとそのパスが含まれます。以前のシェル文字列操作構成を使用して、次のことができるようになりました。
cd ${files[2]%/*}
2番目のファイルのパスに変更します。
上記のコマンドに関するいくつかの注意:
- -d ''オプション(-dと''の間のスペースに注意)は、NULL文字を読み取り区切り文字として選択します。
- オプション-aは、上記のように標準入力をインデックス配列(この場合は「file」と呼ばれる)として読み込みます。
- <<(コマンド)<(と)の間のコマンド出力を標準入力にリダイレクトします。これは読み取りに便利ですが、パイプを介して読み取ることはできません。
- ファイルのみをインポートできるように、 find コマンドに "-type f" を追加しました。
- 参考までにBashの文字列オペランド
- basename(1) および dirname(1) コマンドを使用して同じ目的を達成できますが、新しいプロセスを作成するため、効率がわずかに低下します。