В оболочке пробелы имеют значение. Заменить
a= $(stat -c "%a" "$F")
С:
a=$(stat -c "%a" -- "$F")
(также добавлен разделитель параметров --
, чтобы команда по-прежнему работала для имен файлов, начинающихся с-
)
или
a=$(stat -Lc "%a" -- "$F")
если для символических ссылок вам нужны разрешения цели символической ссылки (, поскольку в большинстве систем разрешения самой символической ссылки не имеют значения ).
Для простоты давайте просто запустим команду stat
для одного файла и сделаем это в интерактивной командной строке:
$ stat -c "%a" file
660
Теперь попробуем команду с пробелом:
$ a= $(stat -c "%a" file)
bash: 660: command not found
$ echo a=$a
a=
Мы получаем сообщение об ошибке, и a
не установлено новое значение. (Если, как в вашем случае, a
ранее был назначен на 1
, он останется неизменным на 1
. )Теперь попробуйте без пробелов:
$ a=$(stat -c "%a" file)
$ echo a=$a
a=660
Это работает. a
успешно устанавливается на число, возвращаемое командой stat
.
Внутри оболочки вы можете использовать раскрытие переменных.
Если fname содержит имя файла (abcd12345678.zip
, например ), вы можете сделать:
fname=abcd12345678.zip
ftail=${fname##*.}
fnew=${fname%??".$ftail"}
echo mv "$fname" "$fnew.$ftail"
Для обработки всех файлов в одном каталоге (проверка существования файла):
for fname in *.zip; do
ftail=${fname##*.}
fnew="${fname%??".$ftail"}.$ftail"
if [ -e "$fnew" ]; then
echo "File $fnew already exist, not moving"
else
echo mv "$fname" "$fnew"
fi
done
Удалите echo
перед echo mv....
, чтобы фактически перемещать файлы, когда вы уверены, что это будет работать правильно.
Популярная оболочка Bash позволяет тестировать регулярные выражения с помощью оператора =~
в тесте [[
. Предположим, что переменная f
содержит это:
$ echo "$f"
abcd12345678.zip
Таким образом можно сопоставить последние цифры:
$ [[ "$f" =~ (.*)..\.zip ]] && echo "${BASH_REMATCH[1]}".zip
abcd123456.zip
Или даже так, чтобы сделать его более абстрактным:
$ [[ "$f" =~ (.*)..(\.zip) ]] && echo "${BASH_REMATCH[1]}""${BASH_REMATCH[2]}"
Для переименования используйте mv
.
Сzsh
:
autoload -Uz zmv # best in ~/.zshrc
zmv -n '(*)??(.*)' '$1$2'
Снимите-n
(для работы всухую -)при удовлетворительном состоянии.
В случаях, когда имя файла содержит более одной точки, удаляется 2 символа перед последним.
А как насчет rename
?
rename 's/..\././g' abcd12345678.zip
Синтаксис такой же, как у sed
.