2013-12-11 300 views
13

我想使用shell腳本命令壓縮文件。我正在使用以下命令:zip命令不起作用

zip ./test/step1.zip $FILES 

其中$ FILES包含所有輸入文件。但我如下

zip warning: name not matched: myfile.dat 

還有一件事我認爲,這是最後的文件夾中的文件列表中的文件有上述警告,該文件是沒有得到拉上得到一個警告。

任何人都可以解釋爲什麼會發生這種情況嗎?我是shell腳本世界的新手。

+3

你能爲'myfile.dat'提供'ls -ltr'嗎?我聽說過一些文件太大和/或是符號鏈接的問題。 – eebbesen

回答

9

拉鍊警告:名稱不匹配:MYFILE.DAT

這意味着該文件myfile.dat不存在。

如果文件是指向不存在文件的符號鏈接,則會出現相同的錯誤。

正如您所說,無論是$FILES的最後一個文件,它都不會隨警告一起添加到zip中。所以我認爲你創建$FILES的方式有問題。機會是在最後一個文件名末尾有換行符,回車符,空格,製表符或其他不可見的字符,導致不存在的內容。試試這個,例如:

for f in $FILES; do echo :$f:; done 

我敢打賭,最後一行是不正確的,例如:

:myfile.dat : 

...或者類似的東西,而不是:myfile.dat:沒有文字之前的最後:

UPDATE

如果你說腳本在runn之後開始工作在dos2unix上,這證實了每個人都已經懷疑的情況,不知何故在你的$FILES列表末尾有一個回車。

od -c顯示\ r回車符。嘗試echo $FILES | od -c

+0

但是我打包查看給定文件夾中的那個文件 –

+0

正如我所說的,列表中的最後一個文件是哪個文件出現該錯誤。如果我嘗試將zip.txt文件和$ FILES文件一起壓縮,那麼type.txt會出現該警告,並且不會包含在zip中! –

+3

然後我們需要更多的細節。 $ FILES中有什麼?根據要求顯示ls。下面的 「爲我工作」:'$的mkdir ziptest $ CD ziptest $觸摸ABC $的mkdir d $觸摸d/E $拉鍊foo.zip ABCD/E 增加:一(存儲0%) 加入:b(保存0%) 加:c(保存0%) 加:d/e(保存0%)' –

0

我使用dos2unix命令將我的腳本轉換爲unix環境,並將腳本執行爲./myscript.sh而不是bash myscript.sh。

+0

'。/ myscript.sh'和'bash myscript.sh'都可以。如果你說這個腳本在運行'dos2unix'後開始工作,這證實了每個人都已經懷疑的事情,不知何故在你的'$ FILES'列表末尾有一個回車符。 – janos

+0

@janos你是對的,有回車。但如果我用'bash myscript.sh'運行腳本,仍然存在問題。但用./myscript.sh我的腳本運行得非常好! –

0

不允許有空格:

如果有一個以上的文件(S)在$文件,除非你把他們在循環

0

它會失敗我剛剛發現的另一個潛在原因這一點。如果目錄/子目錄的權限不允許zip找到該文件,它將報告此錯誤。實際上,如果您在目錄上運行chmod -R 444,然後嘗試壓縮它,您將重現此錯誤,並且還有一個「存儲0%」報告,如下所示:

zip警告:名稱不是匹配:borrar/enviar 增加:borrar /(存儲0%)

因此,請嘗試更改文件的權限。如果您試圖通過電子郵件發送郵件,並且這些電子郵件過濾器(例如Gmail)發明了無法發送可執行文件的愚蠢過濾器,請不要忘記,在進行zip壓縮時,使權限非常嚴格可能是您報告錯誤的原因, 「名稱不匹配」。

1

eebbesen在他對我的案例評論(但我不能投票評論)中點擊。 在其他評論中遺漏的另一個可能原因是文件超出文件大小限制(4GB)。

1

可能會產生zip warning: name not matched:錯誤的另一個可能的原因是zip的環境變量中的任何設置都不正確。

從手冊頁:

ENVIRONMENT 
    The following environment variables are read and used by zip as described. 

ZIPOPT 
    contains default options that will be used when running zip. The contents of this environment variable will get added to the command line just after the zip command. 

ZIP 
    [Not on RISC OS and VMS] see ZIPOPT 

Zip$Options 
    [RISC OS] see ZIPOPT 

Zip$Exts 
    [RISC OS] contains extensions separated by a : that will cause native filenames with one of the specified extensions to be added to the zip file with basename and extension swapped. 

ZIP_OPTS 
    [VMS] see ZIPOPT 

在我的情況,我在腳本中使用zip,不得不在環境變量ZIP所以二進制的位置,我們可以很容易地改變不同的zip二進制未做腳本中的變化量

例子:

ZIP=/usr/bin/zip 
... 
${ZIP} -r folder.zip folder 

這然後被處理爲:

/usr/bin/zip /usr/bin/zip -r folder.zip folder 

,併產生錯誤:

zip warning: name not matched: folder.zip 
zip I/O error: Operation not permitted 
zip error: Could not create output file (/usr/bin/zip.zip) 

第一,因爲它現在嘗試添加folder.zip到存檔而不是將其用作存檔。第二個和第三個是因爲它試圖使用文件/usr/bin/zip.zip作爲歸檔(幸運的是)不能由普通用戶寫入。

注意:這是一個非常古老的問題,但我沒有在任何地方找到這個答案,所以我發佈它來幫助未來的搜索者(包括我未來的自己)。