[英]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.