web-dev-qa-db-ja.com

Linuxファイルシステムでdos形式のファイルを見つける方法

ディレクトリ内のどのファイルが(UNIXテキストファイルではなく)dosテキストファイルであるかを知りたいのですが。

私が試したこと:

find . -name "*.php" | xargs grep ^M -l

それは私に信頼できる結果を与えていません...それで私はより良い代替案を探しています。

何か提案、アイデアはありますか?

ありがとう

説明

私が上で言ったことに加えて、問題は、^ M文字を含まないdosファイルがたくさんあることです(したがって、信頼性についての私のメモ)。

私が現在ファイルがdosであるかどうかを判断する方法は、Vimを介して行われ、下部に次のように表示されます。

"filename.php" [dos] [noeol]
12
denormalizer

「信頼できない」とは正確には何を意味するのかわかりませんが、試してみることをお勧めします。

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

自分で行末を確認してください。

9
paxdiablo

どうですか:

find . -name "*.php" | xargs file | grep "CRLF"

^Mを使用してファイルを検索することは信頼できないと思います。

14
bvpb

私は幸運に恵まれました

find . -name "*.php" -exec grep -Pl "\r" {} \;
1
firebus

これは、元のソリューションとよく似ています。したがって、覚えるのはおそらくもっと簡単です。

find . -name "*.php" | xargs grep "\r" -l

思考プロセス:

VIMで、^ Mを削除するには、次のように入力します。

 %s:/^M//g

ここで、^はCtrlキー、MはENTERキーです。しかし、そのシーケンスを印刷するために入力するキーを思い出せなかったので、常に次のコマンドを使用してそれらを削除しました。

 %s:/\r//g

したがって、私の推測では、\ rと^ Mは同等であり、前者の方が入力を覚えやすいということです。

1
jmort253

どのファイルがこの形式であるかを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はフォルダー内のファイルをループするために使用されます。おそらくこれを行う簡単な方法がありますが、私はそれを本当に知りません。 ..

0
skeept

もしあなたの 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

0
duplexddaann

GNU検索

find . -type f -iname "*.php"  -exec file "{}" + | grep CRLF

それらのDOSphpファイルを見つけた後、何をしたいのかわかりませんが、それらをunix形式に変換したい場合は、

find . -type f -iname "*.php"  -exec dos2unix "{}" +;

十分であろう。それらがDOSファイルであるかどうかを特にチェックする必要はありません。

0
ghostdog74