web-dev-qa-db-ja.com

ディレクトリ内のすべてのプレーンテキストファイルを.txtファイルに変更するにはどうすればよいですか?そのようなコマンドはありますか?

renameコマンドを試してみましたが、成功しませんでした。

6
fedos 3d

あなたのディレクトリがonlyの単純なテキストファイルで満たされていると仮定すると、allファイルと.txtの拡張子を与える最も直接的な方法は、ディレクトリでターミナルウィンドウを開いて次を実行することですコマンド:

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

あなたはコマンドラインを愛する必要があります:)

5
andrew.46

あなたは

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
Dody Body

これを行うには2つの方法があります。

最初安全な方法は、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は結果をフィルタリングして、「 text "。次に、grep -v "\.txt\|exec"は、「。txt」ファイル拡張子とシェルスクリプト実行可能ファイルがすでに含まれているファイルを除外し、sedはファイル名を分離して、ファイルの明確なリストを提供します。

最初の方法は、cpコマンドを使用して、拡張子が「.txt」の各ファイルのcopyを作成します。

2番目の方法では、mvコマンドを使用して、各ファイル名を「.txt」拡張子の付いた新しい名前にmoveします。

また、ループの最初に 入力フィールドセパレーター を使用して、空白スペースのあるファイルを含めました。

1
mchid

これにより、現在のディレクトリにあるすべてのテキストファイルが.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にバイナリファイルをスキップさせます( via )。
実際にはtestの部分は必要ありませんが、mvはエラーメッセージをスローします。


必要な場合の代替recursive

grep -rIlZ . . \
| xargs -0 -I{} sh -c '
      test "$1" != "${1%.txt}.txt" \
      && mv -i -- "$1" "${1%.txt}.txt"
  ' xargs-sh {}
0
pLumo