Как я изменяю все файлы простого текста на .txt файлы в каталоге? Есть ли такая команда?

Я попробовал rename управляйте, но не успешно выполняйтесь.

5
задан 17 October 2019 в 22:45

4 ответа

Принятие Вашего каталога заполнено только простыми текстовыми файлами, самый прямой способ дать все файлы и расширение .txt состоит в том, чтобы открыть Окно терминала в каталоге и выполнить следующую команду:

for f in *; do mv "$f" "$f.txt"; done

Необходимо любить командную строку :)

5
ответ дан 23 November 2019 в 08:58

Можно попытаться использовать

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

Это только для ответа на вопрос!

2
ответ дан 23 November 2019 в 08:58

Вот два способа сделать это.

Во-первых, безопасный путь создаст копию файлов с 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" расширением.

Я также использовал разделитель поля ввода в начале цикла для включения файлов с пробелами.

1
ответ дан 23 November 2019 в 08:58

Это переместит все текстовые файлы в текущий каталог к .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 {}
0
ответ дан 23 November 2019 в 08:58

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

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