Вы можете использовать sed для удаления дубликаты из строки:
for f in *; do
r=$(echo $f | sed -r "s/(.*)(\{Sci-Fi\}|\{Science Fiction\})(.*)(\{Sci-Fi\}|\{Science Fiction\})(.*)/\1\2\3\5/g");
echo $r;
done
Замените echo $ f
на mv "$ f" "$ r"
, если вам нравится вывод.
Вышеупомянутая строка sed
возьмет первое совпадающее слово и удалит второе, если вы хотите всегда отдавать приоритет Sci-Fi
над Science Fiction
, даже когда существует только Научная фантастика
, вы можете сделать это в два этапа:
for f in *; do
r=$(echo $f | sed "s/{Science Fiction}/{Sci-Fi}/");
s=$(echo $r | sed -r "s/(.*)(\{Sci-Fi\})(.*)(\{Sci-Fi\})(.*)/\1\2\3\5/g");
if [ "$f" != "$s" ]; then
echo "moving " $f " to " $s
fi
done
Если ls -l
показывает вопросительный знак(?
)в качестве первого символа в строке, это означает, что тип файла не является нормальным, распознаваемым системой. Файл не обычный файл, не каталог, не символическая ссылка и т.д.
Это может произойти при монтировании не -собственной файловой системы (, например, файловой системы Solaris с дверями ). В этом случае вы можете или не можете взаимодействовать с файлом, открыв его.
Чаще всего это происходит при повреждении файловой системы. В этом случае размонтируйте файловую систему и запустите fsck
. Возможно, вы потеряли некоторые данные.
Для ls
нет возможности отображать числовое значение, которое кодирует тип файла. Если вы хотите показать числовой тип файла, вы можете использовать такие команды, как
strace -e lstat ls -ld the_file
strace -e lstat stat the_file
perl -e 'printf "0%o\n", (stat($ARGV[0]))[2]' the_file
Знание этого числового значения обычно мало полезно.