2012-08-23 226 views
1

裏面一個文件夾,我有一些文件需要檢查文件是否存在?

UEDP01_20120821.csv 
UEDP02_20120821.csv 
UEDP03_20120821.csv 
UEDP04_20120821.csv 
UEDP05_20120821.csv 

只是要檢查所有的文件都存在。如果缺少任何一個文件,則需要創建一個具有相同名稱的空文件。

如:

UEDP01_20120821.csv 
UEDP02_20120821.csv 
UEDP04_20120821.csv 
UEDP05_20120821.csv 

UEDP03_20120821.csv如果這個文件丟失,則需要創建相同的文件。

+0

非常感謝你們的回覆。讓我試試 – Mike

回答

0

這個怎麼樣?檢查名稱的常規文件是否存在。如果沒有,請創建它。

#!/usr/bin/perl 
use strict; 
use warnings; 

my @files = qw(
    UEDP01_20120821.csv 
    UEDP02_20120821.csv 
    UEDP03_20120821.csv 
    UEDP04_20120821.csv 
    UEDP05_20120821.csv 
); 

for my $file (@files) { 
    next if -f $file; 
    open my $fh, '>', $file or die $!; 
} 
0

只需打開一個文件輸出將爲您創建它。

你不說你的文件名列表來自哪裏,但是在下面的程序中我已經對它進行了硬編碼。

請注意,不需要關閉文件句柄$fh,因爲當循環的每個循環結束時變量超出範圍時,Perl會自動關閉它。

-e operator將檢查文件是否存在。或者,您可以使用-f,如果節點存在而且不是目錄,則爲true。如果已經有一個目錄同名那麼open將失敗

use strict; 
use warnings; 

my @files = qw/ 
    UEDP01_20120821.csv 
    UEDP02_20120821.csv 
    UEDP03_20120821.csv 
    UEDP04_20120821.csv 
    UEDP05_20120821.csv 
/; 

for my $file (@files) { 
    open my $fh, '>', $file or die $! unless -e $file; 
} 

更新

正如比爾·魯珀特建議,你可能更願意打開文件進行追加,不管它們是否存在。如有必要,這將創建一個文件,但留給他們不變,如果他們已經在那裏

use strict; 
use warnings; 

my @files = qw/ 
    UEDP01_20120821.csv 
    UEDP02_20120821.csv 
    UEDP03_20120821.csv 
    UEDP04_20120821.csv 
    UEDP05_20120821.csv 
/; 

open my $fh, '>>', $_ or die $! for @files; 
+0

當$ fh超出for循環結束時的範圍時,這會覆蓋現有文件嗎?也許我們'''而不是? –

+0

'unless'修飾符可防止打開現有文件。 – chepner

+0

@Bill Ruppert:代碼很好,但實際上我認爲我更喜歡你的方式。一個開放的追加將保持現有的文件不變,並創建一個空文件,如果它不存在 – Borodin

2

Shell腳本: -

for i in {1..5} 
do 
file="UEDP0${i}_20120821.csv" 
if [ -f $file ] 
then 
    echo the file exists 
else 
>$file 
fi 
done 
+1

shell不是perl,不要在賦值的左側使用'$'。另外,我會引用一點不同的:'file =「UEDP0 $ {i} _20120821.csv」' –

+0

@glennjackman: - 是的,你是對的:)完成。 – perilbrain

1

如果你的文件列表動態變化,那麼你可以在另一個文件中的文件列表,這將使它更容易:

如果你有你在一個文件中的文件名爲list,則:

list將有內容:

UEDP01_20120821.csv 
    UEDP02_20120821.csv 
    UEDP03_20120821.csv 
    UEDP04_20120821.csv 
    UEDP05_20120821.csv 

awk 'system("touch "$1"");' list 

將創建文件,如果它們不存在。

+1

這是一個過程的浪費 - 「貓」。簡單地做:'awk'{system(「touch」$ 1「」)}'列表 – JRFerguson

+0

@JFFerguson你是對的。我正在考慮發佈不同的東西!使用awk的 –

+1

只是聞不到正確的工具,特別是因爲你只是調用shell而已。 –

4

爲什麼你需要這個腳本?

作爲dennis建議您可以使用-a來改變現有文件的訪問時間。

touch -a UEDP0{1..5}_20120821.csv 

將直接創建丟失的文件。

+2

不測試現有文件(如Anon ymous所做的)的缺點是您無條件更新每個文件的'mtime'。您可能想要保留現有文件的信息。 – JRFerguson

+0

是的......但是OP沒有要求他保留現有文件的mtime! – Vijay

+1

假設他沒有,這是一個延伸。 – chepner

5

如果file.txt是文件列表,在bash:

while read fname; do 
    [[ -f $fname ]] || touch "$fname" 
done < file.txt 
+0

這也將工作在ksh。 –

+0

是的,我認爲這裏唯一的非POSIX功能是'[[...]]',我只是用它來避免引用'$ fname'。更改爲'[-f「$ fname」]'完整(?)POSIX合規性。 – chepner

+1

我_believe_'read'在符合POSIX的實現中具有不一致的行爲。我沒有這方面的資源,也沒有足夠的能量/動力來查看它,但是我知道在編寫可移植shell腳本時,我已經被告知要避免「read」。 –