亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 還是批量重命名文件,但是這次是根據(jù)文件名長度 [打印本頁]

作者: 610302547    時間: 2014-08-19 09:05
標(biāo)題: 還是批量重命名文件,但是這次是根據(jù)文件名長度
本帖最后由 610302547 于 2014-08-19 15:04 編輯

HI all,

當(dāng)前有一個需求, 需要重命名/data/ 目錄下面的多個文件, 規(guī)則是, 文件名長度不足20位就自動在文件名后面補0,直到達到20位.超過20位的不做操作.

例如:
#  ls /data/

20140099.txt   2015000.txt  ~22299.txt

以上三個文件中,第一個文件包括后綴名為12位, 第二個文件包括后綴名為11位, 第三個文件包括后綴名為10位,

重命名后的文件名為:
2014009900000000.txt  2015000000000000.txt  ~222990000000000.txt

大概的思路是for 遍歷所有文件,并判斷文件名長度,如果小于20位然后補0,

問題是我不知道怎么直接補0到20位!


UPDATE:
==================================
新需求, 如果后綴有大小寫區(qū)別,并且后綴多樣(txt,png,jpg,abcd,1234455等) 但是這個文件的長度還是需要20位,


作者: dn833    時間: 2014-08-19 09:30
  1. #!/bin/bash

  2. for i in *.txt
  3. do
  4. if [ ${#i} -eq 12 ];then
  5. echo "rename \"${i%.*}\" \"${i%.*}00000000\" \"$i\""
  6. elif [ ${#i} -eq 11 ];then
  7. echo "rename \"${i%.*}\" \"${i%.*}000000000\" \"$i\""
  8. elif [ ${#i} -eq 10 ];then
  9. echo "rename \"${i%.*}\" \"${i%.*}0000000000\" \"$i\""
  10. fi
  11. done
復(fù)制代碼

作者: Herowinter    時間: 2014-08-19 09:32
回復(fù) 1# 610302547
  1. [root@lnx-rh6-x64 test]# for filename in `ls *.txt`; do file_base=${filename%%.*};while [ ${#file_base} -lt 16 ];do file_base="${file_base}0";done;mv "$filename" "${file_base}.txt";done
  2. [root@lnx-rh6-x64 test]# ls
  3. 2014009900000000.txt  2015000000000000.txt  ~222990000000000.txt
復(fù)制代碼
如果后綴名不是固定.txt,自己截取一下后綴名,把那個長度另算一下.
作者: ly5066113    時間: 2014-08-19 09:33
回復(fù) 1# 610302547


try:
  1. for f in *.txt
  2. do
  3.         if [ ${#f} -lt 20 ]
  4.         then
  5.                 nf=${f%.*}000000000000000
  6.                 nf=${nf:0:16}.txt
  7.                 mv $f $nf
  8.         fi
  9. done
復(fù)制代碼

作者: 圣西羅門柱    時間: 2014-08-19 09:40
回復(fù) 4# ly5066113


    請教下${f%.*}是什么意思 正則匹配嗎?
作者: ly5066113    時間: 2014-08-19 09:44
回復(fù) 5# 圣西羅門柱


http://www.72891.cn/forum.p ... p;page=7#pid1617953
作者: li0924    時間: 2014-08-19 09:54
  1. ll data/|awk 'length($NF)<20 && NR>1{split($NF,a,".");while(length(a[1] a[2]) < 20){a[1]=a[1] "0"};system("mv " $NF " " a[1]"."a[2])}'
復(fù)制代碼

作者: 610302547    時間: 2014-08-19 11:37
回復(fù) 4# ly5066113


    4樓牛逼, 請教下兩個nf都是什么意思?
作者: klainogn    時間: 2014-08-19 13:01
看六樓回復(fù) 8# 610302547


   
作者: jason680    時間: 2014-08-19 13:14
回復(fù) 1# 610302547

Would you like this ...

$ ls
20140099.txt  2015000.txt  ~22299.txt

$ rename 's/^(.+)([.]txt)/$1.("0" x (20-length("$1$2"))).$2/e' *.txt

$ ls
2014009900000000.txt  2015000000000000.txt  ~222990000000000.txt

$ rename
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

   
作者: 610302547    時間: 2014-08-19 13:26
本帖最后由 610302547 于 2014-08-19 15:10 編輯

曉得了, 謝謝樓上各位大牛, 只怪自己沒好好看shell十三問, 丟人了!



回復(fù) 9# klainogn


   
作者: 610302547    時間: 2014-08-19 15:02
回復(fù) 10# jason680


    Hi Jason,

    新需求不知道是否還能用你這種方法去做呢?
作者: zhaopingzi    時間: 2014-08-19 15:06
回復(fù) 8# 610302547


    很明顯是nf是new file的意思
作者: 610302547    時間: 2014-08-19 15:09
回復(fù) 13# zhaopingzi


    哈哈, 這個我知道, 我說nf后面的意思, 不過現(xiàn)在知道是什么意思.
作者: 610302547    時間: 2014-08-19 15:59
回復(fù) 7# li0924


    謝謝, 按照這種方法是可以不用考慮后綴的, 問題解決, 謝謝, 但是你最后的那個30要改成29, 這樣最后整個文件名的長度才是30位.
作者: jason680    時間: 2014-08-19 16:11
回復(fù) 12# 610302547

Yes, you can

$ ls
123.jpg  13240.txt  456.abcd  abc.png

$ rename 's/^(.+)([.].+)/$1.("0" x (20-length("$1$2"))).$2/e' *

$ ls
1230000000000000.jpg  456000000000000.abcd
1324000000000000.txt  abc0000000000000.png

   
作者: 610302547    時間: 2014-08-19 16:41
回復(fù) 16# jason680


    Hi Jason,

    Thank you for your attention.
    seems not working on my system , as below screen shot,



作者: MeRcy_PM    時間: 2014-08-19 17:00
可以強行補20位再截取一下吧。
作者: 610302547    時間: 2014-08-19 17:21
回復(fù) 18# MeRcy_PM


    完全可以的. 補100個也沒問題的. 謝謝!
作者: jason680    時間: 2014-08-20 09:35
回復(fù) 17# 610302547

   
我的rename不支持正則
http://www.72891.cn/forum.p ... mp;fromuid=24785593

作者: 610302547    時間: 2014-08-20 13:29
謝謝!
回復(fù) 20# jason680


   




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2