簡體   English   中英

如何使用shell腳本自動化dos2unix?

[英]How to automate dos2unix using shell script?

我在一個目錄中有一堆xml文件需要對它們執行dos2unix命令,並且每隔一段時間就會添加新文件。 我不是每次都在每個文件上手動執行dos2unix命令,而是希望使用腳本自動完成所有這些操作。 在我的生活中,我甚至都沒有看過shell腳本,但到目前為止,我從一些教程中讀到了這些內容:

FILES=/tmp/testFiles/*
for f in $FILES
do
  fname=`basename $f`
  dos2unix *.xml $f $fname
done

但是我一直在顯示'使用'輸出。 我認為問題是我沒有正確分配新文件的名稱(fname)。 誰能幫忙。

謝謝,艾倫

您收到使用消息的原因是dos2unix沒有采用您提供的額外參數。 但是,它會接受多個文件名(也可以通過globs)。 除非您處理的文件多於命令行上可接受的文件,否則不需要循環。

dos2unix /tmp/testFiles/*.xml

應該是你需要的,除非你需要遞歸:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} +

(對於GNU查找)

如果所有文件都在一個目錄中(不需要遞歸),那么你幾乎就在那里。

for file in /tmp/testFiles/*.xml ; do
    dos2unix "$file"
done

默認情況下, dos2unix應該就地轉換並覆蓋原始。

如果需要遞歸,你還必須使用find

find /tmp/testFiles -name '*.xml' -print0 | while IFS= read -d '' file ; do
    dos2unix "$file"
done

這將適用於/tmp/testFiles/及其所有子目錄中以.xml結尾的所有文件。

如果不需要其他步驟,您可以完全跳過shell循環:

非遞歸:

find /tmp/testFiles -maxdepth 1 -name '*.xml' -exec dos2unix {} +

對於遞歸:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} +

在您的原始命令中,我看到您找到每個文件名的基本名稱並嘗試將其傳遞給dos2unix ,但您的意圖並不明確。 稍后,在評論中,您說您只想覆蓋這些文件。 我的解決方案執行轉換,不創建備份並使用轉換后的版本覆蓋原始文件。 我希望這是你的意圖。

mkdir /tmp/testFiles/converted/
for f in /tmp/testFiles/*.xml
do
  fname=`basename $f`
  dos2unix $f ${f/testFiles\//testFiles\/converted\/}
  # or for pure sh:
  # dos2unix $f $(echo $f | sed s@testFiles/@testFiles/converted/@)
done

結果將保存在converted/子目錄中。

構造${f/testFiles\\//testFiles\\/converted\\/} (感謝Rush )或sed用於在文件名前添加converted/

$ echo /tmp/testFiles/1.xml | sed s@testFiles/@testFiles/converted/@
/tmp/testFiles/converted/1.xml

目前尚不清楚您正在使用dos2unix的哪個實現。 不同實現需要不同的參數。 有很多不同的實現。

在RedHat / Fedora / Suse Linux上你可以輸入

    dos2unix /tmp/testFiles/*.xml

在SunOS上,您需要提供輸入和輸出文件名,上述命令將銷毀您的幾個文件。

你使用的是哪個版本?

問候,歐文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM