2012-08-23 176 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”。 –