Удалить 2 символа перед точкой в ​​имени файла

В оболочке пробелы имеют значение. Заменить

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.

2
13.05.2020, 12:50
4 ответа

Внутри оболочки вы можете использовать раскрытие переменных.

Если 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...., чтобы фактически перемещать файлы, когда вы уверены, что это будет работать правильно.

3
28.04.2021, 23:14

Популярная оболочка 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.

0
28.04.2021, 23:14

Сzsh:

autoload -Uz zmv # best in ~/.zshrc
zmv -n '(*)??(.*)' '$1$2'

Снимите-n(для работы всухую -)при удовлетворительном состоянии.

В случаях, когда имя файла содержит более одной точки, удаляется 2 символа перед последним.

0
28.04.2021, 23:14

А как насчет rename?

rename 's/..\././g' abcd12345678.zip

Синтаксис такой же, как у sed.

2
28.04.2021, 23:14

Теги

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