Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
Bash:查找每个名称末尾带有尾随空格的目录_Bash - Fatal编程技术网

Bash:查找每个名称末尾带有尾随空格的目录

Bash:查找每个名称末尾带有尾随空格的目录,bash,Bash,我是Linux的新手(我正在使用LinuxMint),我需要你帮助我理解基本的bash命令 我将文件存储在不同操作系统中使用的外部硬盘驱动器(NTFS格式)上。我的文件被组织在许多目录(文件夹)中,在每个主目录中我有更多的文件夹,在这些文件夹中我有其他文件夹,等等。我需要一个bash命令来查找所有目录,每个名称的末尾都有尾随空格。如果可能的话,我还想使用BASH命令来删除空白。我尝试过寻找其他答案,但我只找到了命令,没有明确解释它们的作用,因此我不确定这是否是我正在寻找的,我不想冒着无意中改变某

我是Linux的新手(我正在使用LinuxMint),我需要你帮助我理解基本的bash命令


我将文件存储在不同操作系统中使用的外部硬盘驱动器(NTFS格式)上。我的文件被组织在许多目录(文件夹)中,在每个主目录中我有更多的文件夹,在这些文件夹中我有其他文件夹,等等。我需要一个bash命令来查找所有目录,每个名称的末尾都有尾随空格。如果可能的话,我还想使用BASH命令来删除空白。我尝试过寻找其他答案,但我只找到了命令,没有明确解释它们的作用,因此我不确定这是否是我正在寻找的,我不想冒着无意中改变某些东西的风险。如果您能帮助解释使用哪些命令,我们将不胜感激

以下内容是为了便于遵循(作为次要目标),并在特殊情况下纠正(作为主要目标):

#因为“find”的用法很密集,我们在数组中定义该命令,所以每个
#…该数组的元素可以描述其用法。
查找命令=(
查找#运行“查找”工具
.#从当前目录中搜索
-深度#深度优先遍历,这样我们就不会使自己的重命名无效
-键入d#仅在结果中包含目录
-将“*[:space:][]”命名为“*[:space:][]”#并过滤*那些*以空格结尾的字符
-print0#…使用NUL字符分隔输出
)
shopt-s extglob#启用扩展glob语法
而IFS=read-r-d''源名称;do#将NUL分隔值读取到源#名称
dest_name=${source_name%%+([[:space:]])}#从name中删除尾随空格
mv--“$source_name”“$dest_name”#将source_name重命名为dest_name
完成查找-名称“*”-类型d

搜索当前目录和子目录

-name
搜索匹配的文件名(星号表示再匹配零个字符,文本空格与文件名末尾的空格匹配)


-type d
搜索目录类型的项目。

mv--“$source\u name”“$dest\u name”
,这就是为什么看到Charles如何做总是一个很好的体验。。。。你说了“在极端情况下是正确的”,干得好。@Charles非常感谢你的回答。按照您提供的定义,我尝试查找带有尾随空格的目录。我还创建了一个带有尾随空格的目录,以确保一切正常工作。我使用了以下语法:find*[:space:][]'-depth-type d-print0。当我运行命令时,我得到了磁盘中所有目录的列表,不区分它们是否有尾随空间,我得到了以下消息:'*[:space:]'没有这样的文件或目录。你能帮我找出问题出在哪里吗?@Leia,在
'*[:space:]'
前面直接加上
-name
是很重要的,否则,它将被视为搜索单个目录的名称,而不是用于筛选的标准。(为了解释上面报告的结果,那么:您的评论中给出的命令是从两个顶级目录中进行搜索:
作为第一个目录,
*[:space:]
作为第二个目录;没有使用后一个名称的目录,因此出现了错误和未过滤的输出。)@Charles非常感谢您的帮助,我真的很感激。我现在明白我错在哪里了。我运行了正确的语法,得到了带有尾随空格的目录列表。然后,我尝试使用以下命令删除尾随空格:shopt-s extglob,而IFS=read-r-d''source\u name;do dest_name=${source_name%%+([[:space:]])}mv--“source_name”“$dest_name”done<您能否澄清在运行命令时,命令在哪里包含换行符?没有换行符是
extglob
while
可能会产生这种效果。在
mv
done
之前还应该有一个换行符或分号。还有其他一些可能的虚假错误源--请确保脚本是用UNIX而不是DOS新行保存的。是否可以添加扩展或指向文档的链接以提高质量和长期价值。。?只有代码的答案是不赞成的。未来的访问可以悄悄地从他们的帖子中学习,并且能够将这些新知识应用到他们自己的问题上。谢谢@SherylHohman和kheftel,我想我很高兴自己最终得到了答案,以至于我不想再解释得更好了。
# because "find"'s usage is dense, we're defining that command in an array, so each
# ...element of that array can have its usage described.
find_cmd=(
  find                 # run the tool 'find'
  .                    # searching from the current directory
  -depth               # depth-first traversal so we don't invalidate our own renames
  -type d              # including only directories in results
  -name '*[[:space:]]' # and filtering *those* for ones that end in spaces
  -print0              # ...delimiting output with NUL characters
)

shopt -s extglob                            # turn on extended glob syntax
while IFS= read -r -d '' source_name; do    # read NUL-separated values to source_name
  dest_name=${source_name%%+([[:space:]])}  # trim trailing whitespace from name
  mv -- "$source_name" "$dest_name"         # rename source_name to dest_name
done < <("${find_cmd[@]}")                  # w/ input from the find command defined above