SHELL技巧:处理文件名中的那些空格

现在很多人命名的时候都喜欢用空格,例如“An Introduction.doc”。但是这种命名方式给Linux命令行工具和Shell带来了困扰,因为大多数命令中,都是默认以空格做为值与值之间的分隔符,而不是做为文件名的一部分。

看下面的脚本,我们可以了解的更清楚:

执行的结果如下:

实际上,当前目录的文件只有两个:

对于简单的文件名,如上例中,我们也可以通过 for i in *doc 这样简单的方法来获得文件列表。但是对于复杂的环境,如下图,我们如何获得这些列表呢?

有一个办法,通过 for i in "* *" 可以获得文件名的列表,但是一个很糟糕的列表,因为这个结果是一个两个文件名在一起的列表,我们完全无法拿来做后续的操作,如下图所示。

通过 "*\ *" 这样的技巧可以避免上面所说的问题,但是在应用mv或其他操作时,还是会出现问题。

上面的问题,可以通过将变量放入引号中("$i")解决,通常情况下,引号中的空格可以被正确的处理。但这并不是一个恒久的解决办法,因为我们无法处理管道、子Shell等复杂的情况。

一个终极的解决办法就是设置IFS(the Internal Field Separator),不要用空格做为IFS,选择其他的符号。先来看看man page:

IFS: The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read built-in command. The default value is “<space><tab><new-line>”.

另外一个办法就是在对文件名进行处理之前,先将空格替换为特殊的自定义符号,然后在处理结束的时候,再替换回来。

safename="$(echo name | sed 's/ /_-_/g')"

original="$(echo $safename | sed s'/_-_/ /g')"

其他还有一些方法,例如利用find命令。

参考资料:

1、Work the shell - Dealing with Spaces in Filenames

2、BASH SHELL:For Loop File Names With Spaces

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏岑玉海

hbase源码系列(八)从Snapshot恢复表

在看这一章之前,建议大家先去看一下snapshot的使用。这一章是上一章snapshot的续集,上一章了讲了怎么做snapshot的原理,这一章就怎么从snap...

3066
来自专栏Jimoer

JVM学习记录-线程安全与锁优化(一)

线程:程序流执行的最小单元。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I...

782
来自专栏JavaEE

Java面试题 - 01

其实对于大多数刚入门的初级程序员来说,写代码都还停留在复制粘贴修改阶段(我也一样),虽然可以复制粘贴的时候看上去很厉害了,其实都是假象。面试的时候可能面试官随便...

1674
来自专栏Phoenix的Android之旅

如何监控app的崩溃

当我们的app上线到应用市场之后,它发生了什么崩溃其实我们是不知道的。今天我们介绍一个方法来监控和收集用户手机上的异常崩溃同时上报给我们自己。

782
来自专栏玄魂工作室

看代码学安全(8 )preg_replace函数之命令执行

--------------------------------------------------------------------------------...

2453
来自专栏小狼的世界

Taints 与 Tolerations

节点亲和性是描述Pods如何分配到一个或一组节点的策略,与之相反 Taints 描述节点拒绝一个或一组Pods的策略。其实现原理为首先通过kubectl tai...

1231
来自专栏Coding01

看 Laravel 源代码了解 Container

自从上文《看 Laravel 源代码了解 ServiceProvider 的加载》,我们知道 Application (or Container) 充当 Lar...

3725
来自专栏salesforce零基础学习

salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)

1864
来自专栏用户2442861的专栏

python操作redis简单例子

#2、配置  配置一下吧,默认配置文件在: “/etc/redis/redis.conf”  绑定ip:  “bind 127.0.0.1″ -> “b...

2552
来自专栏FreeBuf

Nebula漏洞利用包CVE-2016-0189漏洞利用分析

1. 引言 在最近的一年里, 漏洞利用工具包(EK/Exploit Kit)市场风云变幻。2016年六月初,曾经极为猖獗的Angler EK 销声匿迹,Neut...

2806

扫码关注云+社区

领取腾讯云代金券