ディレクトリ内のどのファイルが(UNIXテキストファイルではなく)dosテキストファイルであるかを知りたいのですが。
私が試したこと:
find . -name "*.php" | xargs grep ^M -l
それは私に信頼できる結果を与えていません...それで私はより良い代替案を探しています。
何か提案、アイデアはありますか?
ありがとう
説明
私が上で言ったことに加えて、問題は、^ M文字を含まないdosファイルがたくさんあることです(したがって、信頼性についての私のメモ)。
私が現在ファイルがdosであるかどうかを判断する方法は、Vimを介して行われ、下部に次のように表示されます。
"filename.php" [dos] [noeol]
「信頼できない」とは正確には何を意味するのかわかりませんが、試してみることをお勧めします。
find . -name '*.php' -print0 | xargs -0 grep -l '^M$'
これは、more atrocious-filenames-with-spaces-in-them-friendlyオプションを使用し、行末の直前のキャリッジリターンのみを検索します。
^M
はシングルです CTRLM 文字ではなくtwo文字。
また、one行でもDOSモードになっているファイルが一覧表示されます。これは、UNIX以外のエディターによってマングルされたUNIXファイルであるため、とにかく必要なものです。
あなたのアップデートに基づいて、vimはあなたのファイルをDOSフォーマットとして報告しています:
Vim is DOS形式として報告する場合、every行はCRLF
で終わります。それがvimの仕組みです。 one行にCR
がない場合でも、UNIX形式と見なされ、^M
文字がバッファに表示されます。すべてDOS形式の場合、^M
文字は表示されません:
Vimはdosとunixの両方の行末を探しますが、Vimにはunix形式の組み込み設定があります。
-ファイル内のすべての行がCRLFで終わる場合、dosファイル形式が適用されます。つまり、行をバッファーに読み込むときに各CRLFが削除され、バッファーの「ff」オプションはdosになります。
-1つ以上の行がLFのみで終わる場合、unixファイル形式が適用されます。つまり、各LFが削除されます(ただし各CRはバッファに存在し、^ M)として表示され、バッファの「ff」オプションはUNIXになります。
本当にファイルの内容を知りたい場合は、vimのようなスマートすぎるツールに頼らないでください:-)
使用する:
od -xcb input_file_name | less
自分で行末を確認してください。
どうですか:
find . -name "*.php" | xargs file | grep "CRLF"
^M
を使用してファイルを検索することは信頼できないと思います。
私は幸運に恵まれました
find . -name "*.php" -exec grep -Pl "\r" {} \;
これは、元のソリューションとよく似ています。したがって、覚えるのはおそらくもっと簡単です。
find . -name "*.php" | xargs grep "\r" -l
思考プロセス:
VIMで、^ Mを削除するには、次のように入力します。
%s:/^M//g
ここで、^はCtrlキー、MはENTERキーです。しかし、そのシーケンスを印刷するために入力するキーを思い出せなかったので、常に次のコマンドを使用してそれらを削除しました。
%s:/\r//g
したがって、私の推測では、\ rと^ Mは同等であり、前者の方が入力を覚えやすいということです。
どのファイルがこの形式であるかをvimに通知したい場合は、次のスクリプトを使用できます。
"use this script to check which files are in dos format according to vim
"use: in the folder that you want to check
"create a file, say res.txt
"> vim -u NONE --noplugins res.txt
"> in vim: source this_script.vim
python << EOF
import os
import vim
cur_buf = vim.current.buffer
IGNORE_START = ''.split()
IGNORE_END = '.pyc .swp .png ~'.split()
IGNORE_DIRS = '.hg .git dd_ .bzr'.split()
for dirpath, dirnames, fnames in os.walk(os.curdir):
for dirn in dirnames:
for diri in IGNORE_DIRS:
if dirn.endswith(diri):
dirnames.remove(dirn)
break
for fname in fnames:
skip = False
for fstart in IGNORE_START:
if fname.startswith(fstart):
skip = True
for fend in IGNORE_END:
if fname.endswith(fend):
skip = True
if skip is True:
continue
fname = os.path.join(dirpath, fname)
vim.command('view {}'.format(fname))
curr_ff = vim.eval('&ff')
if vim.current.buffer != cur_buf:
vim.command('bw!')
if curr_ff == 'dos':
cur_buf.append('{} {}'.format(curr_ff, fname))
EOF
vimはpythonでコンパイルする必要があります(pythonはフォルダー内のファイルをループするために使用されます。おそらくこれを行う簡単な方法がありますが、私はそれを本当に知りません。 ..
もしあなたの dos2unix
コマンドには-i
オプションを使用すると、その機能を使用して、DOSの改行があるディレクトリ内のファイルを検索できます。
$ man dos2unix
.
.
.
-i[FLAGS], --info[=FLAGS] FILE ...
Display file information. No conversion is done.
The following information is printed, in this order:
number of DOS line breaks,
number of Unix line breaks,
number of Mac line breaks,
byte order mark,
text or binary, file name.
.
.
.
Optionally extra flags can be set to change the (-i) output.
.
.
.
c Print only the files that would be converted.
次のワンライナースクリプトは次のようになります。
find
このディレクトリツリー内のすべてのファイル、dos2unix
すべてのファイルで、変更するファイルを決定します。dos2unix
変更するファイル$ find . -type f | xargs -d '\n' dos2unix -ic | xargs -d '\n' dos2unix
GNU検索
find . -type f -iname "*.php" -exec file "{}" + | grep CRLF
それらのDOSphpファイルを見つけた後、何をしたいのかわかりませんが、それらをunix形式に変換したい場合は、
find . -type f -iname "*.php" -exec dos2unix "{}" +;
十分であろう。それらがDOSファイルであるかどうかを特にチェックする必要はありません。