Linux 对于循环和带有空格的文件
这是我的命令Linux 对于循环和带有空格的文件,linux,bash,Linux,Bash,这是我的命令 for i in `find . -name '*Source*.dat'`; do cp "$i" $INBOUND/$RANDOM.dat; done; 以下是文件(只是一个示例): 这些空间正在被bash标记化,这不起作用。 另外,我想在这些文件的末尾添加一些随机性,这样它们就不会在目标目录中发生冲突,但这是另一回事。有几种方法可以用空格处理文件。您可以在管道中使用查找,同时阅读: find . -name '*Source*.dat' | while read file
for i in `find . -name '*Source*.dat'`; do cp "$i" $INBOUND/$RANDOM.dat; done;
以下是文件(只是一个示例):
这些空间正在被bash标记化,这不起作用。
另外,我想在这些文件的末尾添加一些随机性,这样它们就不会在目标目录中发生冲突,但这是另一回事。有几种方法可以用空格处理文件。您可以在管道中使用
查找,同时阅读:
find . -name '*Source*.dat' | while read file ; do cp "$file" "$INBOUND/$RANDOM.dat"; done
有几种使用空格处理文件的方法。您可以在管道中使用查找,同时阅读:
find . -name '*Source*.dat' | while read file ; do cp "$file" "$INBOUND/$RANDOM.dat"; done
那么:
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 . -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
我并不一定支持或反对使用当前时间的哈希值生成随机文件名:主要的一点是,您需要先检查该文件是否存在,以防万一。尝试类似的方法
while read i;do
echo "file is $i"
cp "$i" $INBOUND/$RANDOM.dat
done < <(find . -name '*Source*.dat')
阅读时;做
echo“文件是$i”
cp“$i”$INBOUND/$RANDOM.dat
完成<尝试以下操作
while read i;do
echo "file is $i"
cp "$i" $INBOUND/$RANDOM.dat
done < <(find . -name '*Source*.dat')
阅读时;做
echo“文件是$i”
cp“$i”$INBOUND/$RANDOM.dat
完成<
使用-exec
执行命令是安全的。使用sh
执行cp
是为每个副本获取不同的$RANDOM
所必需的
使用-exec
执行命令是安全的。使用sh
执行cp
是为每个副本获取不同的$RANDOM
所必需的。如果所有文件都位于同一目录级别,如您的示例所示,您不需要查找。比如说,
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
。比如说,
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-exec或while read循环,因为对于像'my file*.txt'这样的文件名,循环over find将失败。”它还提供了进一步的详细信息。指向循环并说“使用find-exec或while-read循环,因为对于像‘my file*.txt’这样的文件名,find上的循环将失败。”它还提供了进一步的细节。bash
4引入了**
操作符,即使文件存在于子目录中:for i in**/*Source*.dat;do
bash
4引入了**
操作符,即使文件存在于子目录中:用于**/*Source*.dat中的i;do
这个命令似乎很有效——firectoryAh中只有一个文件在使用。哎呀。我们需要为每个文件使用不同的名称!正如我所写的,每个文件都被复制到同一个名称。我已经编辑了参数占位符{}
,这应该可以解决它了。这个命令似乎很有效——firectoryAh中只有一个文件。哎呀。我们需要为每个文件使用不同的名称!正如我所写的,每个文件都被复制到同一个名称。我已经编辑了参数占位符{}
,这应该可以解决它。4年后,我现在明白了这是做什么的-这是在写了数千行bash之后。我重温这个答案/问题是因为我又遇到了同样的情况:我不想要一个随机的名称,我希望文件的名称与找到它的目录的名称相同。就像dirname{}
但是sytax似乎在4年后就不起作用了,我现在明白这是怎么回事了——这是在我写了数千行bash之后。我重温这个答案/问题是因为我又遇到了同样的情况:我不想要一个随机的名称,我希望文件的名称与找到它的目录的名称相同。像<