同じコマンドを使用する必要がある複数のプロジェクトがあります。プロジェクトはいつも
/home/[username]/public_html/[prjectname]/
私のプロジェクトのすべてのディレクトリでこのコマンドを実行したいので、プロジェクトライブラリを知る必要があります。試しましたが、${path:0:20}
ユーザー名とプロジェクト名の文字列の長さが異なるため。私は知る必要があります。パスの最初の4つの部分。
答え1
あなたはすでにそれを言及していますcut
。区切り記号をに設定します/
。やや直感的でない部分は、最初のフィールドの前の部分度/
(空白)フィールドとして計算されるため、フィールド1〜5が必要です。
echo /1/2/3/4/5/6/7 | cut -d/ -f1-5
明らかにする
/1/2/3/4
答え2
zsh
シェルから if $var
is /1/2/3/4/5/6
, ${var:h1}
is /
, ${var:h2}
is /1
, ${var:h3}
is など/1/2
(h
頭csh
、/と同じvim
で、数字のサフィックスはzsh
拡張子です)
だからここから出る/home/user/public_html/projectX
のはfile=/home/user/public_html/projectX/a/b
dir=${file:h5}
一致するすべてのディレクトリを繰り返すには、/home/*/public_html/*
次の手順を実行します。
for dir in /home/*/public_html/*(N/); do
something with $dir
done
(ディレクトリを含むシンボリックリンク(N/)
に置き換えます。いずれの場合でも、最初のリンクは上記のディレクトリへのシンボリックリンクとも一致します。)(N-/)
*
(N/)
これはグローバル予選、機能によって異なりますzsh
。
答え3
(二重)「パラメータ拡張:一致するプレフィックス/サフィックスパターンの削除」を検討できます。
$ path=/home/[username]/public_html/[prjectname]/abc/xyz
$ echo "${path%"${path#/*/*/*/*/}"}"
/home/[username]/public_html/[prjectname]/
外部コマンドは必要ありません。
答え4
この試み、
find /path/to/dir -mindepth 4 -type d | cut -d"/" -f -5 | sort -u
type -d
目次のみが印刷されます。mindepth
少なくとも4つのサブディレクトリを持つディレクトリが印刷されます。-d"/"
/
切り抜きの区切り記号として使用-f -5
5番目の列のすべての項目を削除します。sort -u
印刷がソートされる一意のフォルダパス。