这是我的命令
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 -print0
和xargs -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')