1. 程式人生 > >shell指令碼:for迴圈批量重新命名含有空格檔名的檔案

shell指令碼:for迴圈批量重新命名含有空格檔名的檔案

今天在學習shell指令碼攻略第二章2.13 批量重新命名和移動時,由於我的檔案命令有的檔名字中有空格,出現問題

問題程式碼

#!/bin/bash
#圖片批量重新命名
count=1;
for img in `find . -name "*.png" -o -name -maxdepth 1 -type f`
do
        echo $count
        new="img-${count}.${img##*.}"
        echo renaming $img: $new
        mv "$img" $new
        let count++
done
IFS=$OLDIFS

最終成功程式碼

#!/bin/bash
#filename: img.sh
#圖片批量重新命名
count=0;
list=`find . -name "*.jpg" -o -name "*.png" -maxdepth 1 -type f -print`
OLDIFS=$IFS
IFS=$'\n'
for img in $list
do
        echo $count
        new="img-${count}.${img##*.}"
        img=${img// /\\ }
        echo $img
        echo $new
        echo renaming $img: $new
        eval mv "$img" $new
        let count=count+1
done
IFS=$OLDIFS

尋找最終成果的步驟

步驟一

思路: 由於在shell中執行此指令碼時,發現將找到的檔名按照空格分割開來,結果利用for迴圈時,每一個檔名被打散,例如’./Screenshot from 2017-09-22 14-43-51.png’ 拆分成了’./Screenshot\ ’ ‘from’ ‘2017-09-22’等,所以執行錯誤. 所以在解決該問題時的第一個思路就是將檔名正確的讀出來.
解決方案: 將
find . -name "*.png" -o -name -maxdepth 1 -type f
改為
find . -name "*.png" -o -name -maxdepth 1 -type f -print


原因: find -print 會將每一個查詢出來的檔案通過換行符分割開
結果: 依然不行,但是在shell中直接輸入該命令,確實是換行輸出

步驟二

思路: 雖然輸出是換行輸出,但是是for迴圈在讀入的時候是從一個大字串中進行分割,而分割的標識是IFS,IFS預設分隔符是空格\tab\換行,所以會將換行符和空格同樣對待,所以需要更改IFS的分割標誌.
解決方案:新增程式碼

OLDIFS=$IFS
IFS=$'\n'
IFS=$OLDIFS

注意: 這裡將IFS的分割標誌換成了 $’\n’ 換行符,如果寫成’\n’僅僅表示字母n
結果: 每一次for迴圈能夠得到正確的檔名,但是在執行mv命令時依然報錯,原因是檔名中有空格,不能找到正確的檔案

步驟三

思路: 在shell中直接執行mv命令,會把檔名中帶有空格的檔案的檔名的空格進行轉譯,即將’ ‘轉成’\ ‘.所以這一步的思路就是得到轉譯之後的檔名
解決方案:新增程式碼

img=${img// /\\ }

結果: 可以將檔名正確的轉換成轉譯之後的檔名,但是依然不能正確執行,shell中提示的錯誤資訊是

mv: cannot stat './Screenshot\ from\ 2017-09-22\ 14-43-51.png': No such file or directory

但是我直接用這個檔名進行mv命令操作是可以進行的,所以這個時候進行最後一步

步驟四

思路: 得到了正確的檔名,但是不能正確的執行mv操作,那麼問題就在指令碼的這個命令上

mv "$img" $new

所以我在mv前面加上了一個預處理的命令 eval

eval mv "$img" $new

mv命令在執行前會先執行eval命令,將變數的值轉換過來,然後在執行,最後得到了正確的結果

知識點

在完成整個檔案批量重新命名的過程中主要用到了一下幾個知識
1. find -print 和-print0
2. IFS 分隔符
3. 字串替換的方法
4. eval命令
5. 以後命名的時候千萬不要在帶空格了,很麻煩

相關推薦

shell指令碼:for迴圈批量重新命名含有空格檔名檔案

今天在學習shell指令碼攻略第二章2.13 批量重新命名和移動時,由於我的檔案命令有的檔名字中有空格,出現問題 問題程式碼 #!/bin/bash #圖片批量重新命名 count=1; for img in `find . -name "*.png" -o

shell指令碼for迴圈對變數動態命名

這個問題找了好久才找到了解決方法,記錄在這裡方面以後忘記了再來看,首先看eval命令作用: eval命令將會首先掃描命令列進行所有的替換,然後再執行命令。該命令使用於那些一次掃描無法實現其功能的變數。

Linux下用shell指令碼for迴圈新增使用者

#!/bin/bash for name in $(more users.list) do if [ -n "$name" ];thenuseradd -m $name echoecho $name"123" | passwd --stdin "$name" echoech

[powershell] 批量重新命名,修改檔名中的部分字串

  例項:替換一個目錄下所有的字幕檔案從720p到1080p ls $Path -Include 'ass' -Recurse |ForEach-Object{Rename-Item $_.FullName $_.FullName.Replace('720p','1080p')}

shell指令碼迴圈讀取引數,檔案批量重新命名

for  ana  in para do do something for ana done 其實就是for in,很簡單。 以下是修改當前檔名的例項,在檔名前加上H265字首: #!/bin/bash for file in `ls *` do mv $fil

Linux下Shell指令碼實現批量重新命名資料夾,批量重新命名檔案(讓原本繁重的工作變得簡單)

最近接了個專案,具體做什麼都不說了,其中有個工作就是批量更改資料夾,然後批量更改資料夾下的檔名字,一會兒先貼程式碼,再詳細解釋步驟。 下面是我的簡化版的目錄結構,實際上有上百個。 project dir1 dir1.py dir2

Windows下用指令碼批量重新命名檔案

1. 我的效果: 2. reference reference:https://blog.csdn.net/txz317/article/details/52326041 在Windows下可以用指令碼批量重新命名檔案,且可以將檔名按指定的字串格式命名,並按序號遞

python指令碼自動刪除空資料夾和非指定型別檔案(附贈批量重新命名)

python指令碼自動刪除空資料夾和非指定型別檔案 直接上程式碼吧: # -*- coding: utf-8 -*- """ Created on Sun Sep 16 22:51:27 2018 @author: lele """ import

Linux 批量重新命名檔案的方法

1.使用rename命令 SYNOPSIS rename from to file... from 表示需要替換或者處理的字元,比如檔案的副檔名,檔名. to 表示對from處理之後的結果。 file 表示目標檔案。 [[email protected] tmp]# ls hello_10_201

批量重新命名大量檔案

參考自《linux shell 指令碼攻略(第2版)》 將一個資料夾下所有後綴為JPEG的檔案重新命名為字尾為jpg的檔案,檔名不變。 當資料夾下的檔案數量太多時,使用普通的方法會報錯: Argument list too long. for img in `find . -name '

linux下批量重新命名檔案

假設資料夾Data裡有幾個資料資料夾, 每個資料資料夾內有多個數據檔案,該檔名稱格式為: 2014.143.20.49.21.0000.YN.BAS.00.BHE.M.SAC 現想要將這些檔名稱改為BAS.E.SAC, 即取原檔名的幾列重新命名,方法如下: #!/bin/bash #將資料檔

python對某一路徑下的某種型別檔案進行批量重新命名

"""對某一路徑下的某種型別檔案進行批量重新命名""" import os #檔案路徑,注意用/或\\,不能用\ path='D:\\CrawledData' #返回指定的資料夾包含的檔案或資料夾的名字的列表 file_list=os.listdir(path) n=0 for file_obj i

matlab批量重新命名

matlab批量重新命名 clc close all clearvars file_path = 'E:\rc\9-27\I110-100\'; p = dir([file_path,'*.tiff']); for idx_img = 1:numel(p) name = st

shell程式設計—for迴圈

shell迴圈 shell迴圈的分類 1、for 2、while 3、until for迴圈結構 for 變數 in 列表; do 迴圈體 done 1、求1加到100的和 #!/bin/bash # sum of 1 to 100 Sum=0 for i in {1..100}

使用正則表示式-對檔案批量重新命名

import reimport os# re.match ;使用者匹配字串開頭:如果不是起始位置匹配成功的話,match()就返回none# 引數1:匹配的正則表示式,引數2:要匹配的字串,標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配(非必填)# 我們可以使用group(num) 或 g

Renamer 5 Mac版(檔案批量重新命名工具)

推薦一款檔案批量重新命名工具,Renamer 5 Mac版可以快速輕鬆地重新命名多個檔案,使用便捷,同時renamer mac破解版還支援查詢並替換文字、更改副檔名、將檔名轉換為大寫和小寫等功能,如果你需要重新命名大量檔案,那就試試renamer破解版吧,這樣效率會更高哦! renamer mac破

rename命令和批量重新命名

本文為轉載文章,轉發自 https://blog.csdn.net/GGxiaobai/article/details/53507454 早期版本的rename是C語言版本,如今新的Ubuntu中採用的都是perl版本,功能更加強大 Usage:rename [-v] [-n] [-f] perle

IC數字前端設計開發21 (shell指令碼示例:批量比較多個檔案的內容是否相同)

來自:https://www.linuxidc.com/Linux/2017-08/146536.htm   要比較兩個檔案的內容是否完全一致,可以簡單地使用diff命令。例如: diff file1 file2 &>./tmp/null.txt 但是dif

批量重新命名檔案結構

import os f = open("./name_test.txt", 'w') # 先建立一個空的文字 f_jpg = open("./name_jpg.txt", 'w') f_txt = open("./name_txt.txt", 'w') path = "./jzchina4/" #

JAVA批量重新命名

起因 原檔名太過於冗長,而且看起來肥腸的不爽,於是就想把它改掉!!! 改完之後,現在這樣就爽多了!!! 程式碼 import java.io.File; public class FileReName { public static void main(Str