需要检查文件是否存在?

时间:2012-08-23 10:37:25

标签: linux perl shell awk ksh

在一个文件夹里面我有一些文件

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 如果此文件丢失,则需要创建相同的文件。

6 个答案:

答案 0 :(得分:5)

如果file.txt是您的文件列表,请使用bash:

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

答案 1 :(得分:4)

为什么你需要一个脚本呢?

正如dennis建议你可以使用-a来改变现有文件的访问时间。

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

将直接创建丢失的文件。

答案 2 :(得分: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

答案 3 :(得分:1)

如果您的文件列表动态更改,那么您可以在另一个文件中包含一个文件列表,这样可以更轻松:

如果您的文件位于名为list的文件中,则:

list将包含以下内容:

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

awk 'system("touch "$1"");' list
如果文件不存在,

会创建文件。

答案 4 :(得分: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;
}

<强>更新

根据Bill Ruppert的建议,您可能更喜欢打开要追加的文件,无论它们是否存在。这将在必要时创建文件,但如果它们已经存在则保持原样

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;

答案 5 :(得分: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 $!;
}