for file in /foo/*
do
if [ -f "$file" ]
then
dd if="$file" of="$file.truncated" bs=31 skip=1 && mv "$file.truncated" "$file"
fi
done
или быстрее, благодаря предложению Gilles:
for file in /foo/*
do
if [ -f $file ]
then
tail +32c $file > $file.truncated && mv $file.truncated $file
fi
done
Примечание: Хвост Posix указывает "-c +32" вместо "+32c", но хвосту значения по умолчанию Соляриса не нравится он:
$ /usr/bin/tail -c +32 /tmp/foo > /tmp/foo1
tail: cannot open input
/usr/xpg4/bin/tail
соглашается с обоими синтаксисами.
Править: измененный -t
кому: -t 0
, который действительно правильно обнаруживает вход от терминала или файла.
Я думаю, что ключ здесь знает, прибывает ли Ваш вход из терминала или из файла. Существует тест для этого (man test
, посмотрите -t
).
Принятие Вы запускаете скрипт удара:
if [ -t 0 ]; then
echo "Input from terminal"
if [ $# -eq 0 ]; then
echo "No input files specified on command line. Error." >&2
else
echo "Input file given on command line. It is $1"
fi
else
echo "Input coming from stdin"
fi
Можно обработать различные сценарии путем замены фактическим кодом в для операторов эха выше.
Обновление, беглый сценарий тестирования:
#!/bin/bash
[ -t 0 ] && echo "t is true" || echo "t is false"
Выполнение:
$ test.sh testfile
t is true
$ test.sh < testfile
t is false
$
В целом, выражения $1
, $2
, и т.д. расширьтесь до 1-го, 2-го, и т.д. аргумент, данный на командной строке сценария.
Так, когда Вы вызываете сценарий как:
myscript.sh myfile
затем $1
в рамках сценария расширяется до myfile
(и $2
, $3
, и т.д. все - пустая строка).
Когда Вы вызываете сценарий как:
myscript < myfile
перенаправление STDIN от myfile
сделан родительской оболочкой, таким образом, сценарий на самом деле называют без аргументов и $1
расширяется до пустой строки.
< myfile
:( – mschonaker 27.06.2011, 10:28-t 0
дает корректные результаты. Обновленный ответ. – unpythonic 27.06.2011, 10:390
? Каково различие? Это не находится в документации. – Ivan V. 05.02.2016, 23:470
, стандартный вывод с1
и стандартная погрешность с2
. Если бы я хотел проверить, шел ли мой вывод в терминал, я использовал бы[ -t 1 ]
– unpythonic 06.02.2016, 00:16