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