CD два уравнивает от корня

tar ограничьте имена файлов 256 байтами (с расширениями GNU). Файловые системы Linux поддерживают по крайней мере 256 байтов за имя файла. Это означает любой файл, упакованный tar может быть извлечен без ошибки. Таким образом, я предполагаю две причины:

  1. tarball повреждается, проверьте его:

    $ tar -tvf tarball.tar
    

    Вы будете видеть некоторый erros если таковые имеются.

  2. Вы используете "виртуальную" файловую систему как fusecompress или ecryptfs (с выборочным файлом copmpression/encryption), и Ваше имя файла немного короче или равно ограничению файловой системы. Прием - когда Вы монтируете каталог с fusecompress (например), и создаете имя файла foo.bar виртуальная файловая система создает названный файл foo.bar.gz и сожмите его прозрачно, но скрывает реальное имя файла от Вас. И если Вы создаете файл с 254-байтовым именем долго, Вы получаете ошибку, потому что оно попытается добавить суффикс к нему.

    В этом случае просто извлечение tarball за пределами виртуальной файловой системы должно помочь:

    $ sudo mkdir /home/${USER}-temp
    $ sudo chown $USER /home/${USER}-temp
    $ tar -xvf tarball.tar -C /home/${USER}-temp
    

Так или иначе попытайтесь проследить его для получения большей информации:

$ strace -o tar-strace.log tar -tf tarball.tar
$ ltrace -o tar-ltrace.log tar -tf tarball.tar

2
26.01.2019, 17:52
4 ответа
specialcdcommand() cd ${(M)PWD#/*/*/}

Или:

specialcdcommand() cd ${${(M)PWD#/*/*/}:?Not deep enough}

или:

specialcdcommand() cd "${(M)PWD#/*/*/}"

чтобы не идти в Ваш корневой каталог, если Вы уже не, более чем два уравнивают.

В zsh, (M) переменный флаг расширения изменяет поведение ${var#pattern} оператор так Совпавшая строка расширен вместо того, чтобы быть удаленным. :? оператор стандарта/Границы состоит в том, чтобы возвратить ошибку (и отменить команду), если переменная расширяется до пустой строки. Отметьте это zsh единственная оболочка, которая имеет последовательный способ вложенных расширений параметра.

POSIXly:

specialcdcommand() {
  p=${PWD#/*/*/}
  [ "$p" = "$PWD" ] || cd "${PWD%"$p"}"
}

Или постараться не ударять $p переменная:

specialcdcommand() {
  set -- "${PWD#/*/*/}"
  [ "$1" = "$PWD" ] || cd "${PWD%"$p"}"
}
3
27.01.2020, 21:54
  • 1
    Хорошее решение POSIX! Это на самом деле требуется, чтобы заключать расширение в кавычки $p в рамках расширения параметра "${PWD%"$p"}"? Я вижу" [e] nclosing, полная строка расширения параметра в двойных кавычках не должна заставлять следующие четыре варианта символов образца быть заключенными в кавычки, тогда как заключение в кавычки символов в фигурных скобках должно иметь этот эффект" в POSIX 2004, но я думаю, что только относится к hardcoded сопоставлению с образцом, если я читаю правильно. Поведение при обнаружении с шаблоном в неупомянутой неуказанной переменной? –  Chris Down 03.02.2014, 12:51
  • 2
    @ChrisDown, да это необходимо кроме zsh где сопоставление с образцом на переменной не неявно кроме sh эмуляция. "${PWD#$p}" (${PWD#$~p} в zsh) "$PWD" с ведущей ролью, соответствующей $p удален шаблон. "${PWD#"$p"}" (или ${PWD#$p} в zsh), "$PWD" с содержание $p удаленный из запуска. Попробуйте p='*/*' –  Stéphane Chazelas 03.02.2014, 12:58

Это изменит каталог на второй наиболее удаленный каталог (он должен работать в любой оболочке POSIX пока имена файлов, и имена каталогов не содержат символы новой строки):

descend() {
    IFS=/ read -r x root project x << EOF
$PWD
EOF
    cd "/${root:+$root/$project}"
}

Это работает путем разделения (первая строка) путь к его компонентам, вынимания корня и названий проекта, и откладывания их вместе.

Если бы необходимо было расширить это неограниченно долго, то Вы могли бы использовать (непортативное устройство) -a переключатель к read, который создает массив.

2
27.01.2020, 21:54
  • 1
    <<< хорошо работает в ударе или zsh, но не поддерживается в более основных оболочках POSIX как dash. pwd|read будет всегда работать. –  michas 03.02.2014, 12:19
  • 2
    @michas, pwd|read будет работать (за исключением того, что это остановится в первом символе новой строки), но read как гарантирует (POSIX), не не будет работать в подоболочке (в zsh это не делает хотя). –  Stéphane Chazelas 03.02.2014, 12:24

Я сказал бы:

cd "/`pwd|cut -d"/" -f2,3`"

создайте сценарий и включайте эту строку внутри.
Кавычки позволяют использовать пространство или вкладку в имени файла.
Это не будет работать с папкой, содержащей пространство.

Можно интегрировать его к Вашему .zshrc файл профиля как это:

function prjroot(){
    cd "/`pwd|cut -d"/" -f2,3`" && return 0;
}  

Также, если Ваш на основном уровне как /opt /usr это ничего не сделает.

0
27.01.2020, 21:54
  • 1
    Это повредится, если Ваше имя каталога будет содержать какой-либо символ в $IFS. –  Chris Down 03.02.2014, 11:44
  • 2
    , что $IFS ? Мне любопытно на предмет этого. –  Kiwy 03.02.2014, 11:45
  • 3
    , поскольку мы говорим о zsh Я думаю, что название переменной отличается. потому что я не могу найти его в человеке zsh. Но хорошо, мой тест действительно работает настолько толстый даже с пространством. –  Kiwy 03.02.2014, 11:47
  • 4
    Это - внутренний разделитель полей, посмотрите man zshparam. –  Chris Down 03.02.2014, 11:51
  • 5
    я предполагаю добавляющие кавычки, должен добиться цели нет? @ChrisDown –  Kiwy 03.02.2014, 12:01

Сначала необходимо удостовериться, что Вы находитесь в каталоге проекта. Я предлагаю Вас эта функция:

function cdproot (){
    CURRENT=`pwd`
    [[ $CURRENT == /workspace/* ]] && echo "Going to project home.." || ( echo "Not in a project subfolder" ; return 1 )
    PROOT=`echo $CURRENT | awk -F\/ '{print "/"$2"/"$3}'`
    cd "$PROOT" && return 0;
}

Добавьте его к Вам ~/.bashrc файл

1
27.01.2020, 21:54
  • 1
    Это повредится, если результирующий каталог будет содержать символы от $IFS. –  Chris Down 03.02.2014, 11:56
  • 2
    @ChrisDown, это не будет. Дайте мне противоположный пример. –  Slyx 03.02.2014, 12:00
  • 3
    Делает использование zsh bashrc файл? –  Kiwy 03.02.2014, 12:05
  • 4
    @Kiwy Нет! в этом случае это должно быть добавлено к ~/.zshrc файл, конечно! вопрос не указывает оболочку, используемую, таким образом, я предположил Bash как :-) –  Slyx 03.02.2014, 12:07
  • 5
    @Slyx ну, во время моего комментария, это было бы. Ваше редактирование исправляет его несколько, но все еще перестало работать для каталогов, которые содержат несколько последовательных экземпляров символов от $IFS. –  Chris Down 03.02.2014, 12:40

Теги

Похожие вопросы