Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 对于循环和带有空格的文件_Linux_Bash - Fatal编程技术网

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之后。我重温这个答案/问题是因为我又遇到了同样的情况:我不想要一个随机的名称,我希望文件的名称与找到它的目录的名称相同。像<