Я попробовал rename
управляйте, но не успешно выполняйтесь.
Принятие Вашего каталога заполнено только простыми текстовыми файлами, самый прямой способ дать все файлы и расширение .txt состоит в том, чтобы открыть Окно терминала в каталоге и выполнить следующую команду:
for f in *; do mv "$f" "$f.txt"; done
Необходимо любить командную строку :)
Можно попытаться использовать
file -i NameofFileGoesHere
команда.
Посмотрите, обнаруживаете ли Вы Демонстрационный Вывод шаблона:
file.mp4: application/octet-stream; charset=binary
filenumplayer1: inode/x-empty; charset=binary
foobar.ogg: application/octet-stream; charset=binary
Для некоторых файлов это возвращается:
headstart.save: text/x-shellscript; charset=us-ascii
Вы ищете отмеченный "ASCII" файлов, Но они могли быть Действительно любым видом файла. Особенно, если это - файл, который не был создан Вами. Это не была бы хорошая идея переименовать его.
Но если все файлы являются действительно персональными файлами. На основе вышеупомянутой информации я попробовал бы следующий сценарий
#!/bin/bash
for f in *
do
#Looking for the string us-ascii hence this command
whatis=$(file --mime "$f" | awk -F "=" '{print $2}')
if [[ $whatis == "us-ascii" ]]
then
mv "$f" "$f.txt"
fi
done
Это только для ответа на вопрос!
Вот два способа сделать это.
Во-первых, безопасный путь создаст копию файлов с txt расширением и сохранит исходные файлы:
IFS=$'\n'; for i in $(file * | grep text | grep -v "\.txt\|exec" | sed 's/\:.*$//g'); do cp -- "$i" "$i".txt; done
С другой стороны, следующий метод не сохранит исходные файлы:
IFS=$'\n'; for i in $(file * | grep text | grep -v "\.txt\|exec" | sed 's/\:.*$//g'); do mv -- "$i" "$i".txt; done
Оба из этих методов используют file
команда для определения, какие файлы являются текстовыми ASCII-файлами. Затем grep
фильтрует результаты, чтобы только включать файлы, которые являются "текстом".Далее, grep -v "\.txt\|exec"
исключает файлы, которые уже содержат ".txt" расширение файла и исполняемые файлы сценария оболочки и sed
изолирует имена файлов, чтобы дать нам чистый список файлов.
Первый метод использует cp
команда для создания копии каждого файла с ".txt" расширением.
Второй метод использует mv
управляйте для перемещения каждого имени файла в новое имя с ".txt" расширением.
Я также использовал разделитель поля ввода в начале цикла для включения файлов с пробелами.
Это переместит все текстовые файлы в текущий каталог к .txt
если у них не уже есть то расширение.
Можно изменить или удалить -maxdepth 1
сделать это рекурсивным.
find . -maxdepth 1 -type f \
-exec grep -Iq . {} \; \
-exec sh -c '
test "$1" != "${1%.txt}.txt" \
&& mv -i -- "$1" "${1%.txt}.txt"
' find-sh {} \;
grep -Iq . {}
позволит find
пропустите двоичные файлы (через).
Вам действительно не нужно это test
часть, но затем, mv
бросит сообщение об ошибке.
Альтернатива, если Вы хотите это рекурсивный:
grep -rIlZ . . \
| xargs -0 -I{} sh -c '
test "$1" != "${1%.txt}.txt" \
&& mv -i -- "$1" "${1%.txt}.txt"
' xargs-sh {}