別の下位レベルの親を使用してほぼ同じパスに変更するにはどうすればよいですか?たとえば、作業中で同じパスに移動する必要がある場合は、入力せずにそこに行くことができますか?もちろんエレガントでぎこちない解決策もあります。~/foobar/foo/data/images/2020/01/14/0001/
bar
foo
cd ~/foobar/bar/data/images/2020/01/14/0001/
答え1
ksh
などの一部のシェルでは、zsh
現在のディレクトリのパス名の最初のエントリをに変更して、指定されたcd word1 word2
ディレクトリを変更します。word1
word2
たとえば、zsh
シェルでは次のようになります。
$ pwd
/usr/local/sbin
$ cd sbin bin
/usr/local/bin
$
${variable/pattern/replacement}
元の非標準パラメータ置換をサポートする他のシェルでは、ディレクトリを生成するパス名をksh93
使用して次のように変更できます。${PWD/word1/word2}
$ pwd
/usr/local/sbin
$ cd "${PWD/sbin/bin}"
$ pwd
/usr/local/bin
これらのシェル(bash
例:)では、cd
次のように2つの引数を合計として扱う単純な関数を直接作成することもできます。ksh
zsh
cd () {
if [ "$#" -eq 2 ] && [[ $1 != -* ]]; then
command cd -- "${PWD/$1/$2}" &&
printf 'New wd: %s\n' "$PWD"
else
command cd "$@"
fi
}
[ "$#" -eq 2 ]
特別なアクションがトリガーされなければならない時期を検出しますcd
(コマンドライン引数が正確に2つある場合)。しかし、私たちがテストする[[ $1 != -* ]]
のはいいえでオプションを使用すると、特別な動作がトリガーされますcd
。関数内で置換を使用すると、command cd
関数が再帰的に呼び出されるのを防ぎます。cd
テストbash
:
$ cd /usr/local/sbin
$ cd sbin bin
New wd: /usr/local/bin
$ cd local ''
New wd: /usr/bin
$ cd bin sbin
New wd: /usr/sbin
$ cd sbin local/sbin
New wd: /usr/local/sbin
$ cd '*/' /
New wd: /sbin
最後のコマンドは、/
最後まで一致するパターンに置き換えられます。スキーマを参照する必要があります。パターンを抑制し、常に最初の引数を単語として扱うには、関数でcommand cd "${PWD/"$1"/$2}"
(引用符を参照)を使用します$1
。
さらに、完全なディレクトリ名にのみ影響を与えるように置き換えるには、を使用しますcommand cd "${PWD/"/$1/"/"/$2/"}"
。 2つの引数の前後に人為的に挿入すると、/
ディレクトリ名の部分文字列の一致が防止されますが、動作方法と互換性がなくなり、許可されなくなりますzsh
。最後にksh
はないので、ディレクトリパスの最後の部分で置き換えを行う必要があります(追加の「ヘルプ」が邪魔になる前にのみ役立つことができます)。/
これ会議ただし、cd foo bar
質問の例を使用してください。それ以外の場合は、withなどの他の方法foo
で一致しないようにする必要があります。foobar
cd foo/ bar/
答え2
それは簡単です。
cd "$( echo "$PWD" | sed -e 's%/foo/%/bar/%' )"
sed
コマンドの後に続く文字をs
区切り文字として使用します。
答え3
CLI では、次の例のように修飾子を使用できます。
$ mkdir -p foobar/foo/data/images/2020/01/14/0001/
mkdir: created directory 'foobar'
mkdir: created directory 'foobar/foo'
mkdir: created directory 'foobar/foo/data'
mkdir: created directory 'foobar/foo/data/images'
mkdir: created directory 'foobar/foo/data/images/2020'
mkdir: created directory 'foobar/foo/data/images/2020/01'
mkdir: created directory 'foobar/foo/data/images/2020/01/14'
mkdir: created directory 'foobar/foo/data/images/2020/01/14/0001/'
$ ^bar/foo^bar/bar^
mkdir -p foobar/bar/data/images/2020/01/14/0001/
mkdir: created directory 'foobar/bar'
mkdir: created directory 'foobar/bar/data'
mkdir: created directory 'foobar/bar/data/images'
mkdir: created directory 'foobar/bar/data/images/2020'
mkdir: created directory 'foobar/bar/data/images/2020/01'
mkdir: created directory 'foobar/bar/data/images/2020/01/14'
mkdir: created directory 'foobar/bar/data/images/2020/01/14/0001/'
説明する:
最初のコマンドは、foobarで始まるネストしたディレクトリを作成します。 2番目のコマンドは^修飾子を使用して、前のコマンドの文字列を新しい文字列に置き換えます。次のように入力するとミスしやすいです。
^foo^bar^
ただし、これによりコマンドは次のように変更されます。
mkdir -p barbar/foo/data/images/2020/01/14/0001/
これは先行するfooにも影響を与えるため、これを防ぐために、予想される文字列の前後にいくつかの文字を使用できます。
この例ではmkdirを使用しましたが、cdも似ています。 HTH。
答え4
時にはマウスを使用する方が簡単です。、グラフィックデスクトップで良い端末エミュレータを使用しているとします。または、screen
最新バージョンでは、キーボードコントロールを使用していくつかのテキストをコピー/貼り付けることができます。
$ pwd
/some/long/path
そのパスをコマンドにコピーして貼り付けますcd
。つまり、パスをダブルクリックしてフルパスを選択するか、スペースがある場合はパスをダブルクリックしてフルラインを取得します。その場合は、貼り付ける前に一重引用符を入力してください。
次に、シェルの行編集キーを使用して、Bashemacs
モードで前の部分を編集します。
- ctrl-a カーソルを行の先頭に移動します。
- 正しいコンポーネントが見つかるまで、ctrl-右矢印(またはalt-f)を数回押して単語単位で進めます。
- alt-d または alt-backspace は単語全体を前後に削除します。
- 代替項目(タブ補完を使用)を入力してEnterキーを押します。
あなたが何かをたどるなら、それはcd
ただの命令であり、破壊的なことはしません。