昨天写个小脚本批量重命名下载文件夹里的文件,for file in $(ls) 一把梭,结果有个叫"周报 终版.pdf"的,中间带空格,直接被劈成"周报"和"终版.pdf"两个词,mv一路报错还差点把别的文件搞丢~呢
嗯
后来才搞明白,不加引号shell就按空格分词,空格跟刀一样。正解是for file in * 或者用while read,别去吃ls的输出。
服了这坑我前后踩了三回,回回都觉得下次肯定记住了,下次照样栽。你们谁也在文件名上翻过车,说出来让我心里平衡一下哈哈
昨天写个小脚本批量重命名下载文件夹里的文件,for file in $(ls) 一把梭,结果有个叫"周报 终版.pdf"的,中间带空格,直接被劈成"周报"和"终版.pdf"两个词,mv一路报错还差点把别的文件搞丢~呢
嗯
后来才搞明白,不加引号shell就按空格分词,空格跟刀一样。正解是for file in * 或者用while read,别去吃ls的输出。
服了这坑我前后踩了三回,回回都觉得下次肯定记住了,下次照样栽。你们谁也在文件名上翻过车,说出来让我心里平衡一下哈哈
我懂你说的那种"明明上次才吃过亏怎么又栽了"的无力感,这种坑就是专门跟人记性过不去。
我之前也拿 for 循环批量处理过下载文件夹里的东西,同样被空格劈过,当时还纳闷为什么有几个文件凭空消失了,后来才反应过来是 mv 把前半截当源、后半截当目标,悄咪咪给挪了位。所以你写的 while read 那个写法我举双手赞成,我现在都养成条件反射先敲 for file in * 了。
是呢能三次都爬出来、没真把重要东西弄丢,其实已经挺走运啦。下次再手滑之前,先在临时目录里拿几个废文件试一遍?~
等等,你这句"差点把别的文件搞丢"我得追问一下,到底差点搞丢的是哪个?是mv报错之前已经动了一部分、还是整文件夹都快被你犁一遍了?这种命令跑了一半才发现不对的最吓人,我光想想手心都冒汗。
还有你踩了三回这事,我怀疑你第一回和第二回之间根本不是同一个坑,会不会第一次是空格、第二次是中文编码、第三次才是真的又栽回空格上?卧槽人记错自己翻车原因的事可太常见了。哈哈哈
绝了太!
顺便有个事不知道该不该说,我听人聊过一回,说有人for循环里mv没加引号,把某目录下的东西全给挪进了回收站还浑然不知,第二天上班才发现上周的活全没了……当然这版本我也没法证实,说不定是添油加醋的。嘛
你那个"周报 终版"后来改名叫啥了?我猜现在应该是"周报_终版"或者"zhoubao_final_v3"这种了吧哈哈
你这"回回记住了回回还栽"我可太有共鸣,我前两天也是手比脑子快,明知道要加引号还是一把梭了,主打一个头铁。说真的 shell 对空格那股恨意真不是吹的,"周报 终版"被劈成两半那一下,我都能脑补你对着终端石化的表情 ( ̄▽ ̄)
等等,差点搞丢的到底是啥文件?我怎么听说有人mv一通把整个目录都霍霍了,最后是靠回收站捞回来的,你那边最后咋救的
我太能共情了,光看描述都能想象你当时对着报错一脸懵的样子。我之前也翻过类似的车,整理下载文件夹的时候,一个文件名里藏着空格加中文括号,脚本直接给我表演原地裂开,差点把好不容易排好序的照片全弄乱,当时真的欲哭无泪。
后来也是老老实实改成 for file in * 才消停。btw 这种小脚本就是这样,越觉得轻车熟路越容易栽。会好的你这都第三回了还笑得出来,心态已经比我稳多了哈哈。下次动手前先 cp 一份备份,心里会踏实很多~
我跟你一模一样 每次都觉得这回肯定记住了 手一快又照样栽 上次差点把一整个文件夹mv进沟里 现在看见带空格文件名先抖三抖
这坑简直是凡是手痒想写脚本的人的共同成年礼了。你那个"回回觉得记住了,下次照样栽"我直接笑出声——太真实,大脑对同一个坑的遗忘速度堪称专业级。
好家伙
我前阵子也干过类似的蠢事,图省事 for i in $(ls) 一把梭,结果带空格的文件名被劈成两半,还纳闷怎么凭空少了一半文件。后来老老实实换成 for i in *,世界瞬间清净。
不过你漏了个更狠的法子:find . -print0 | xargs -0,空格换行全给你摁死,文件名再怎么歪都不带崩的,下次批量处理可以试试。
同一道坑摔三回真不丢人,主要是 shell 这东西最擅长在你最笃定的时候给你来一下子。
我当年也在这坑里泡过,不过我是图省事 ls | grep 之后直接往管道里塞,名字一劈开,mv 把我半个文件夹挪去了别处,回滚了半天。
你那两条正解里 for file in * 没问题,glob 不做分词,空格原样留着。但 while read 那句得补全才真稳:
while IFS= read -r f; do
mv -- "$f" "/dest/$f"
简单说done < <(ls)
不写 IFS= 的话 read 默认把行首尾空格吞掉,文件名本身带前导空格的就漏了;-r 是别让反斜杠被当成转义。
碰上更野的符号(真有人把换行塞进文件名里),直接 find . -maxdepth 1 -print0 | xargs -0,null 分隔通吃。还有 mv 遇到以 `
哈哈我懂这种感觉,总觉得下次记住了结果手比脑子快。我以前也老干这种顾头不顾尾的事,栽了才拍大腿~
我也差不多,同一个坑能连栽三回,每次都拍胸脯说记住了,转头照摔不误。楼主不孤单哈
空格这把刀切下去的时候,谁都以为自己是那个例外。
我盯着你那句"回回都觉得下次肯定记住了,下次照样栽"看了好一阵。人就是这样,脑子认了账,手却还停在旧习惯里,像潮水一遍遍漫过同一块石头,明知会湿,还是要来。
仔细想想
其实你这三回栽得一点都不冤。肯一遍遍伸手去拨弄的人,总比那些从不动手、因此也从不犯错的人,日子要热乎些。错误是烫的,冷漠才是真的凉。
说实话那个叫"周报 终版"的文件,现在还安分地躺在你的文件夹里吧?替我问候它一声,毕竟它差点成了你mv命令行下的烈士。
补充一点,while read 也得写全。裸 read 默认被 IFS 掐掉首尾空白,反斜杠还会被转义,得 IFS= read
我上次更惨,整理下载的评书文件,'三国演义 第三回.mp3’被劈成两半,后半截直接找不着了,我找半天以为电脑把文件吃了哈哈哈。空格真是温柔的刺客,平时看不出来一上手就捅你。我现在学乖了,文件名带空格全换成下划线,丑点但省心。Друг这坑我也踩过好几回,记性这东西真的不靠谱