用于循环和带有空间的文件



这是我的命令

for i in `find . -name '*Source*.dat'`; do cp "$i" $INBOUND/$RANDOM.dat; done;

这是文件(只是一个示例):

/(12)SA1 (Admitting Diagnosis) --_TA1-1 + TA1-2/Source.dat
./(12)SA1 (Admitting Diagnosis) --_TA1-1 + TA1-2/Source_2000C.dat
./(13)SE1 (External Cause of Injury) --_ TE1-1+TE1-2/Source.dat
./(13)SE1 (External Cause of Injury) --_ TE1-1+TE1-2/Source_2000C.dat
./(13)SE1 (External Cause of Injury) --_ TE1-1+TE1-2/Source_POATest.dat
./(14)SP1(Primary)--_ TP1-1 + TP1-2/Source.dat
./(14)SP1(Primary)--_ TP1-1 + TP1-2/Source_2000C.dat
./(14)SP1(Primary)--_ TP1-1 + TP1-2/Source_ProcDateTest.dat
./(15)SP1(Primary)--_ TP1-1 + TP1-2 - SP2 -- TP2-1 + TP2-2/Source.dat
./(16)SP1(Primary)--_ TP1-1 + TP1-2 +TP1-3- SP2 -- TP2-1 + TP2-2/Source.dat
./(17)SP1(Primary)--_ TP1-1 + TP1-2 +TP1-3/Source.dat
./(18)SP1(Primary)--_ TP1-1 + TP1-2 - SP2 -- TP2-1 + TP2-2 - Copy/Source.dat
./(19)SD1 (Primary)+SD2 (Other Diagnosis)--_ TD12/Source.dat
./(19)SD1 (Primary)+SD2 (Other Diagnosis)--_ TD12/Source_2000C.dat
./(19)SD1 (Primary)+SD2 (Other Diagnosis)--_ TD12/Source_POATest.dat
./(2)SD3--_TD4 SD4--_TD4/Source.dat
./(2)SD3--_TD4 SD4--_TD4/Source2.dat

这些空间被bash被象征化,这是行不通的。此外,我想将一些随机性附加到这些文件的末尾,以便它们不会在目标目录中碰撞,但这是另一个故事。

find . -name '*Source*.dat' -exec sh -c 'cp "$1" "$2/$RANDOM.dat"' -- {} "$INBOUND" ;

使用-exec执行命令是安全的。使用sh执行cp对于每个副本获得不同的$RANDOM是必要的。

如果所有文件都处于相同的目录级别,则与您的示例相同,您不需要find。例如,

 for i in */*Source*.dat; do
   cp "$i" $INBOUND/$RANDOM.dat
 done

将正确象征化,并找到正确的文件,只要它们都是当前目录的孩子的目录。

@chepner在评论中指出,如果您有bash v4,则可以使用 **

 for i in **/*Source*.dat; do
   cp "$i" $INBOUND/$RANDOM.dat
 done

应该找到与find完全相同的文件,而没有令牌化问题。

怎么样:

find . -name '*file*' -print0 | xargs -0 -I {} cp {} $INBOUND/{}-$RANDOM.dat

xargs是构造参数列表并将其传递到命令的方便方式。

  • find -print0xargs -0一起进行,基本上是关于如何终止参数的两个命令之间的协议。在这种情况下,这意味着该空间不会被解释为参数的终结。

  • -I {}设置{}作为xargs的参数占位符。

对于随机对文件名进行随机避免碰撞,显然您可以做很多事情来生成一个随机字符串以附加。但是,最重要的部分是您验证您的新文件名也不存在。您可能会使用类似的循环尝试:

$RANDOM=$(date | md5)
filename=$INBOUND/$RANDOM.dat
while [ -e $filename ]; do
  $RANDOM=$(date | md5)
  filename=$INBOUND/$RANDOM.dat
done

我不一定提倡或反对以当前时间为单位的随机文件名:要点是,您想先检查该文件的存在。

有几种用空格处理文件的方法。您可以在管道中使用find,然后阅读:

find . -name '*Source*.dat' | while read file ; do cp "$file" "$INBOUND/$RANDOM.dat"; done

尝试

之类的东西
while read  i;do
  echo "file is $i"
  cp "$i" $INBOUND/$RANDOM.dat
done < <(find . -name '*Source*.dat') 

相关内容

  • 没有找到相关文章

最新更新