سؤال

لدي مجموعة (مئات) من الملفات التي من المفترض أن تحتوي على نهايات سطر Unix.أظن بشدة أن بعضها لديه نهايات أسطر Windows، وأريد أن أعرف برمجيًا أي منها لديه نهايات.

أعلم أنه يمكنني الركض فقط

flip -u
أو شيء مشابه في برنامج نصي لتحويل كل شيء، ولكن أريد أن أكون قادرًا على تحديد تلك الملفات التي تحتاج إلى التغيير أولاً.

هل كانت مفيدة؟

المحلول

يمكنك استخدام grep

egrep -l $'\r'\$ *

نصائح أخرى

يمكنك استخدام ال file الأداة التي ستخبرك بنوع نهاية السطر.أو يمكنك فقط استخدام dos2unix -U والذي سيحول كل شيء إلى نهايات أسطر Unix، بغض النظر عما بدأ به.

شيء على غرار:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME

على الرغم من أن بعض هذا التعبير العادي قد يحتاج إلى تحسين وترتيب.

سيؤدي ذلك إلى إخراج ملفك باستخدام WIN أو MAC أو UNIX في نهاية كل سطر.جيد إذا كان الملف الخاص بك عبارة عن فوضى مروعة (أو فرق) وله نهايات مختلطة.

إليك الإجابة الأكثر أمانًا.إجابة Stimms لا تأخذ في الاعتبار الدلائل الفرعية والملفات الثنائية

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • يستخدم file للعثور على نوع الملف.أولئك الذين لديهم CRLF لديهم أحرف إرجاع windows.إخراج file يتم تحديده بواسطة أ :, والحقل الأول هو مسار الملف.

يستخدم Unix بايت واحد، 0x0A (LineFeed)، بينما يستخدم Windows وحدتي بايت، 0x0D 0x0A (Carriage Return، Line Feed).

إذا لم ترَ 0x0D مطلقًا، فمن المحتمل جدًا أن يكون Unix.إذا رأيت أزواج 0x0D 0x0A فمن المحتمل جدًا أن يكون MSDOS.

يستخدم Windows char 13 و 10 لإنهاء السطر، ويونكس واحد منهم فقط (لا أتذكر أي منهما).لذا يمكنك استبدال char 13 و 10 بالحرف 13 أو 10 (الذي يستخدم يونكس).

عندما تعرف الملفات التي لها نهايات أسطر Windows (0x0D 0x0A أو \r \n)، ماذا ستفعل بهذه الملفات؟أفترض أنك ستحولها إلى نهايات سطر Unix (0x0A أو \n).يمكنك تحويل الملف بنهايات سطر Windows إلى نهايات سطر Unix باستخدام sed الأداة المساعدة، فقط استخدم الأمر:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt

يمكنك وضعه في البرنامج النصي مثل هذا:

#!/bin/bash

function travers()
{
    for file in $(ls); do
        if [ -f "${file}" ]; then
            sed -i 's/\r//' "${file}"
        elif [ -d "${file}" ]; then
            cd "${file}"
            travers
            cd ..
        fi
    done
}

travers

إذا قمت بتشغيله من الدليل الجذر الخاص بك مع الملفات، فستتأكد في النهاية من أن جميع الملفات ذات نهايات سطر Unix.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top