2017-07-11 91 views
4

我的代碼有效,但不是我想要的。基本上,我的代碼所做的是通過當前目錄查找,搜索文件夾,並在這些文件夾中查看這些文件。如果其中一個文件擴展名是$ Example變量的值,那麼它應該刪除具有相同起始文件名的所有其他文件,而不考慮擴展名,並將帶有$ Example擴展名的擴展名重命名爲相同名稱,而不使用$示例擴展。下面是代碼:保持* nix格式

#!/bin/sh 
set -o errexit 
Example=dummy 
for d in *; do 
    if test "$(ls -A "$d" 2>/dev/null)"; then 
     if [ $(ls -1 ${d}/*.$Example 2>/dev/null | wc -l) -ge 1 ]; then 
      cd $(pwd)/$d; 
      for f in *.$Example; do 
       fileName="${f%.$Example}"; 
       mv "$f" "${f%.$Example}"; 
       #tr "\r" "\n" < "${f%.$Example}" > "${f%.$Example}" 
       listToDelete=$(find -name "$fileName.*"); 
       for g in $listToDelete; do 
        rm $g; 
       done; 
      done; 
      cd ..; 
     fi; 
    fi; 
done 

使用VIM中已創建的文件,所以應該有Linux的格式,而不要使用Windows的格式化。由於某些原因,一旦擴展名已被刪除,使用此代碼,它將被格式化爲\r,並且文件無法運行。我在臨時解決方案所在的位置添加了註釋,但我想知道是否有某種方法可以改變保留Linux格式的功能,或者可能有另一種方法來實現我想要的功能。由於

+3

'mv'不應該改變文件內容,不管你怎麼稱呼它。 –

+1

你如何檢查該文件是否有'\ r'而不是'\ n'? –

+1

我無法在我的系統上重現此問題,我相信您的問題存在於別處。 –

回答

0

這個答案並沒有解決在腳本源代碼,一個可能的流浪\r的問題,而是給人做的另一種方式是什麼,我相信是用戶想要達到什麼樣的:

#!/bin/bash 

ext='dummy' 
tmpfile=$(mktemp) 

find . -type f -name "*.$ext" \ 
    -execdir bash -x -c \ 
     'cp "$3" "$2" && 
     tee "${3%.$1}"* <"$2" >/dev/null' bash "$ext" "$tmpfile" {} \; 

rm -f "$tmpfile" 

這發現的所有文件與該擴展名併爲他們每個人的執行

cp "$3" "$2" && tee "${3%.$1}"* <"$2" >/dev/null 
  • $1將沒有點的擴展。
  • $2將是臨時文件的名稱。
  • $3將被找到的文件。

該命令將第一找到的文件複製到一個臨時文件中,然後它會喂該臨時文件通過tee這將重複其內容具有相同前綴的所有文件(${3%.$1}將剝離從找到的文件名的擴展名和${3%.$1}*將展開到具有相同前綴的同一目錄中的所有文件)。

find的大多數現代實現支持-execdir,它的工作原理與-exec一樣,區別在於給定的實用程序將在所找到的名稱的目錄中執行。另外,{}將是發現事物的無路徑基礎名稱。

鑑於一個目錄下面的文件:

$ ls test/ 
f1.bar f1.foo f2.bar f2.foo f3.bar f3.foo 
f1.dummy f1.txt f2.dummy f2.txt f3.dummy f3.txt 

此腳本執行以下操作:

$ bash -x script.sh 
+ ext=dummy 
++ mktemp 
+ tmpfile=/tmp/tmp.9v5JMAcA12 
+ find . -type f -name '*.dummy' -execdir bash -x -c 'cp "$3" "$2" && 
     tee "${3%.$1}"* <"$2" >/dev/null' sh dummy /tmp/tmp.9v5JMAcA12 '{}' ';' 
+ cp f1.dummy /tmp/tmp.9v5JMAcA12 
+ tee f1.bar f1.dummy f1.foo f1.txt 
+ cp f2.dummy /tmp/tmp.9v5JMAcA12 
+ tee f2.bar f2.dummy f2.foo f2.txt 
+ cp f3.dummy /tmp/tmp.9v5JMAcA12 
+ tee f3.bar f3.dummy f3.foo f3.txt 
+ rm -f /tmp/tmp.9v5JMAcA12 

bash(從bash在命令行)調用刪除-x禁用跟蹤。


我用bash而不是sh因爲我sh不能神交${3%.$1}正常。

0

正在使用的文件是在VIM中創建的,所以應該使用Linux格式,而不是Windows格式。

這對正在使用的生產線分離器沒有影響。

但我能想到3種不同的可能原因。

VIM取代

\r\n可能已被混淆或Windows線分離器(\r\n)可能已被錯誤地條紋進行。如果您只是想在某些時候轉換Windows行分隔符,請將它們轉換爲Unix行分隔文件,如果可能的話,將其轉換爲dos2unix而不是sedvim,然後編輯它們。如果文件使用ViM添加或替換行分隔符,請記住在ViM行分隔符中使用\n進行搜索,並用\r替換,因爲ViM只是將文件數據加載到緩衝區中。例如%s/\n/somestring/%s/somestring/\r/g

Cygwin的

如果你使用Cygwin,我敢肯定它默認使用vim Windows行分隔符,但你可以將其更改爲Unix行分隔符。不記得如何離開我的頭頂。

VIM默認的行分隔符

不知道如何,如果你是一個GNU/Linux系統上這一切都不會發生,但在VIM使用默認的行分隔符可以指定使用的Unix :e ++ff=unix