tar
ограничьте имена файлов 256 байтами (с расширениями GNU). Файловые системы Linux поддерживают по крайней мере 256 байтов за имя файла. Это означает любой файл, упакованный tar
может быть извлечен без ошибки. Таким образом, я предполагаю две причины:
tarball повреждается, проверьте его:
$ tar -tvf tarball.tar
Вы будете видеть некоторый erros если таковые имеются.
Вы используете "виртуальную" файловую систему как 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
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"}"
}
Это изменит каталог на второй наиболее удаленный каталог (он должен работать в любой оболочке POSIX пока имена файлов, и имена каталогов не содержат символы новой строки):
descend() {
IFS=/ read -r x root project x << EOF
$PWD
EOF
cd "/${root:+$root/$project}"
}
Это работает путем разделения (первая строка) путь к его компонентам, вынимания корня и названий проекта, и откладывания их вместе.
Если бы необходимо было расширить это неограниченно долго, то Вы могли бы использовать (непортативное устройство) -a
переключатель к read
, который создает массив.
<<<
хорошо работает в ударе или zsh, но не поддерживается в более основных оболочках POSIX как dash
. pwd|read
будет всегда работать.
– michas
03.02.2014, 12:19
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
это ничего не сделает.
$IFS
.
– Chris Down
03.02.2014, 11:44
zsh
Я думаю, что название переменной отличается. потому что я не могу найти его в человеке zsh. Но хорошо, мой тест действительно работает настолько толстый даже с пространством.
– Kiwy
03.02.2014, 11:47
Сначала необходимо удостовериться, что Вы находитесь в каталоге проекта. Я предлагаю Вас эта функция:
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
файл
$IFS
.
– Chris Down
03.02.2014, 11:56
~/.zshrc
файл, конечно! вопрос не указывает оболочку, используемую, таким образом, я предположил Bash как :-)
– Slyx
03.02.2014, 12:07
$IFS
.
– Chris Down
03.02.2014, 12:40
$p
в рамках расширения параметра"${PWD%"$p"}"
? Я вижу" [e] nclosing, полная строка расширения параметра в двойных кавычках не должна заставлять следующие четыре варианта символов образца быть заключенными в кавычки, тогда как заключение в кавычки символов в фигурных скобках должно иметь этот эффект" в POSIX 2004, но я думаю, что только относится к hardcoded сопоставлению с образцом, если я читаю правильно. Поведение при обнаружении с шаблоном в неупомянутой неуказанной переменной? – Chris Down 03.02.2014, 12:51zsh
где сопоставление с образцом на переменной не неявно кромеsh
эмуляция."${PWD#$p}"
(${PWD#$~p}
вzsh
)"$PWD"
с ведущей ролью, соответствующей $p удален шаблон."${PWD#"$p"}"
(или${PWD#$p}
в zsh),"$PWD"
с содержание$p
удаленный из запуска. Попробуйтеp='*/*'
– Stéphane Chazelas 03.02.2014, 12:58