rename
コマンドを試してみましたが、成功しませんでした。
あなたのディレクトリがonlyの単純なテキストファイルで満たされていると仮定すると、allファイルと.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
これは質問に答えるだけです!
これを行うには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します。
また、ループの最初に 入力フィールドセパレーター を使用して、空白スペースのあるファイルを含めました。
これにより、現在のディレクトリにあるすべてのテキストファイルが.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 {}