Выведите список всех имен файлов в каталоге с последними 5 символами, удаленными из каждого

Это будет безопасно обрабатывать имена файлов.

#!/bin/bash
shopt -s extglob  # see http://mywiki.wooledge.org/glob

for file in note!(*.txt); do
    mv -i "$file" "$HOME/notes/$file.txt"
done
mv -i note*.txt "$HOME/notes/"

Если вы хотите нечувствительность к регистру, также включите опцию оболочки nocaseglob.

shopt -s extglob nocaseglob [!d2 ]

EDIT: Другой подход

#!/bin/bash
for file in note*; do
    # Make sure it's a regular file and not the destination directory
    [[ -f $file && ! $file -ef $HOME/notes ]] || continue
    mv -i "$file" "$HOME/notes/${file%.[Tt][Xx][Tt]}.txt"
done
1
задан 2 May 2015 в 01:47

3 ответа

В дополнение к запросу steeldriver, поскольку подстрока, которая должна быть исключена, одинакова для всех файлов, вы можете использовать операцию замещения расширения параметра bash:

for file in *.time; do echo "${file/.time/}"; done | sort -n > file.txt

Это заменит [ f5] с пустой строкой, т. е. .time исключается из имен файлов.

Синтаксис операции подстановки -

${Parameter/OLD/NEW}

Это заменит только первое вхождение OLD с NEW, если вы хотите, чтобы все вхождения OLD были заменены на NEW:

${Parameter//OLD/NEW}
2
ответ дан 23 May 2018 в 20:47

Итак, вы просто хотите числа и не хотите .time. Мои два цента здесь:

ls /path/to/*.time | cut -d '.' -f1  > toSomeFile.txt
1
ответ дан 23 May 2018 в 20:47

Выполняйте то же самое с помощью команд find и basename следующим образом:

find /path/to/dir -name '*.time' -exec basename {} .time \; > someFile

basename {} .time, удаляет суффикс «.time» из fileNames. [F4] представляют текущее найденное имя файла.

0
ответ дан 23 May 2018 в 20:47

Другие вопросы по тегам:

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