У меня есть некоторые файлы и папки, которые были сохранены в Linux на внешнем жестком диске, некоторые из этих файлов и папок содержат символы "::" я хочу удалить эти символы из всех файлов и папок на диске, поскольку я получаю проблемы при попытке просмотреть файлы в окнах.
Я успешно удалил их из одной папки при помощи в терминале -
rename 's/:://' *::*.*
когда в том единственном каталоге, но хотят сделать это для всех файлов и папок на диске, и существует много sub папок.
Что может я добавлять к вышеупомянутой команде, чтобы заставить его работать над всеми sub папками и файлами в sub папках или является там лучшей командой.
Спасибо.
Вы могли попробовать рекурсивный сценарий. Вот что-то вроде того, что работало бы. Это работает над тестовым каталогом, который я просто сделал, который содержит файлы и каталоги, которые содержат файлы, которые называют, как Вы описываете. этот сценарий идет рекурсивно через все дерево каталогов и заменяет любое происшествие:: в любых именах файлов с точкой. Это настраивается для принятия каталога или списка каталогов как аргумент или аргументы, но это также работает над единственным файлом. Не уверенный, что это составляет все необходимые соображения или возможные ошибочные сценарии, хотя, поэтому скорректируйте его для того, в чем Вы нуждаетесь при использовании его.
#!/bin/bash
function rmCols() {
if [[ ! -e $1 ]]
then
usage "$1" 1
fi
if [[ -f $1 ]]
then
if [[ -w $1 ]]
then
rename :: . "$1"
else
usage "$1" 2
fi
elif [[ -d $1 ]]
then
if [[ -w $1 ]]
then
for THING in "$1"/*
do
if [[ -f $THING ]]
then
rename :: . "$THING"
elif [[ -d $THING ]]
then
rmCols "$THING"
fi
done
else
usage "$1" 3
fi
else
usage "$1" 4
fi
}
function usage() {
echo "
Usage:
rmCols accepts a variable number of files and/or directories as arguments and will add the
current date between the filename and the file type extension for all files in all directory
argument(s) or for any file argument(s), recursively.
Syntax:
rmCols dirName_1 [dirName_2] [dirName_3] ......." >&2
if [[ $2 -eq 1 ]]
then
echo "
Error:
There is no such file or directory as $1, check your spelling" >&2
exit 1
elif [[ $2 -eq 2 ]]
then
echo "
Error:
You do not have permission to change the file $1" >&2
exit 2
elif [[ $2 -eq 3 ]]
then
echo "
Error:
You do not have permission to change the directory $1" >&2
exit 3
elif [[ $2 -eq 4 ]]
then
echo "
Error:
$1 is something other than a file or directory" >&2
exit 4
fi
}
shopt -s nullglob
for item in "$@"
do
[[ -h $item ]] && continue
rmCols "$item"
done
exit 0
Это только изменяет имена файлов не имена каталогов, хотя небольшая модификация должна обработать имена каталогов также. Там вероятно инструмент Linux, который сделает это без сценария, хотя, я просто не знаком с ним. Хотя это работает, я уверен, что существует лучшее решение.
Можно использовать find
управляйте для поиска файлов и каталогов рекурсивно напр.
find path/to/start/dir/ -depth -name '*::*.*' -exec rename 's/:://' {} +
-depth
важно, если Вы переименовываете файлы и каталоги (иначе, команда может "висячая строка" некоторые подобранные файлы путем переименования их содержания каталогов, прежде чем это будет иметь шанс переименовать их). Если Вы только хотите переименовать файлы, то можно добавить -type f
и отбрасывание -depth
.
Я рекомендую выполнить команду сначала с rename -n
удостоверяться, что это делает правильную вещь.