2015-10-11 80 views
0

我想寫一個自定義腳本,將重命名所有的文件中包含的文件名點目錄,遞歸。像: MV 'foo.bar.avi' '富bar.avi'奇怪的行爲與fs.rename:文件刪除(node.js的)

它還轉換目錄的名稱,如 'A.B.C/x.y.z.mp4' 變成了 'A B C/X y.mp4' 並刪除所有下劃線_。

結果中刪除所有該目錄中的文件的結束,只留下一些空目錄,沒有任何通知或錯誤,讓我肯定會輸unbackuped數據大約300 GB。

有精彩的代碼,允許這一壯舉:

var fs = require('fs'); 
var path = require('path'); 
var util = require('util'); 
var fse = require('fs-extra') 
var async = require('async'); 
var walk = function(dir, done) { 
    var results = []; 
    fs.readdir(dir, function(err, list) { 
    if (err) return done(err); 
    var pending = list.length; 
    if (!pending) return done(null, results); 
    list.forEach(function(file) { 
     file = path.resolve(dir, file); 
     fs.stat(file, function(err, stat) { 
     if (stat && stat.isDirectory()) { 
      walk(file, function(err, res) { 
      results = results.concat(res); 
      if (!--pending) done(null, results); 
      }); 
     } else { 
      if (file.indexOf('/.') < 0) { 
      results.push(file); 
      } 
      if (!--pending) done(null, results); 
     } 
     }); 
    }); 
    }); 
}; 
var rename = function(err, filename) { 
    if (util.isArray(filename)) { 
     for (var i = 0; i < filename.length; i++) { 
     rename(err, filename[i]); 
     } 
     return; 
    } 
    fs.stat(filename, function(err, stat) { 
     if (!stat.isDirectory()) { 
     filename2 = filename.split('.'); 
     var extension = filename2.pop(); 
     filename2 = filename2.join(' ').split('_').join(' ') + '.' + extension; 
     var directory = filename2.split('/'); 
     directory.pop(); 
     directory = directory.join('/'); 
     async.series([ 
      function (callback) { 
      fse.mkdirs(directory, function (err) { 
       callback(err, 'fs.mkdirs'); 
      }); 
      }, 
      function(callback) { 
      fs.rename(filename, filename2, function (err) { 
       callback(err, 'fs.rename'); 
      }); 
      } 
     ], 
     function (err, results) { 
      if (err) { 
      console.log(err); 
      } 
      console.log('All files have been renamed'); 
     }); 
     } 
    }); 
} 
walk('/Volumes/My Passport/Movies/', function(err, results) { 
    rename('', results); 
}); 

這是來不及做任何事情,我已經哀悼這方面的損失。

我只是想了解這fs.rename如何能夠刪除的文件。

我不敢相信我做到了。我甚至不生氣,這是驚人的。我的腳本刪除了300gb的數據,甚至沒有一條關於刪除的單個指令。我接受了我的信仰。

我懷疑fs.rename是外部驅動越野車。

謝謝。

+0

哎喲...但爲什麼在未備份的數據上運行未經測試的代碼呢? – Scimonster

+0

好問題。我對我的腳本,節點JS和外部硬盤足夠有信心。現在我知道你不能相信一個旨在重命名某些文件的腳本=) – Charaf

+0

現在我知道,如果NSA聘用了我,我可以刪除他們的所有文件,而他們不知道這些文件是什麼。我是新的斯諾登。 ...(哈哈,Charaf試圖笑,而不是哭) – Charaf

回答

0

所以,這是一個可惜的說,但問題是,你忘記var時聲明filename2。因此,filename2成爲一個全球變量。 fs.rename每次都獲得相同的值。該解決方案將要麼聲明文件名爲var filename2或擺脫async.series

+1

這是一個很好的例子來說明爲什麼你應該總是使用嚴格的模式! – PatrickD