2013-01-07 29 views
0

我有一堆文件在我想重命名的目录中。我有一个完整的现有文件名列表,并且在旧名称旁边的列中,我有一个新名称(所需)文件名,如下所示:(该列表位于Excel中,因此我可以非常轻松地将一些语法应用于所有行)如何重命名目录中的一批文件?

OLD NAME   NEW NAME 
--------   -------- 
aslkdjal.pdf  asdlkjkl.pdf 
adkjlkjk.pdf  asdlkjdj.pdf 

我想保留旧名称和旧文件在其当前目录中,不打扰他们,只是创建该文件的副本,新的文件名来代替。

不知道要使用哪种语言以及如何去做。

+3

你考虑使用PHP或其他服务器端语言。绝对不是JS或SQL – Undefined

+0

使它成为一个批处理文件,包含每个文件的'copy oldname newname'。 –

+0

你在使用什么操作系统? – ddinchev

回答

1

就用下面的例子尝试:

<?php 
$source = '../_documents/fees'; 
$target = '../_documents/aifs'; 

$newnames= array(
    "1276.aif.pdf" => "aif.10001.pdf", 
    "64.aif.20091127.pdf" => "aif.10002.pdf", 
); 

function recurse_copy($src,$dst) { 
    $dir = opendir($src); 
    @mkdir($dst); 
    while(false !== ($file = readdir($dir))) { 

     if (($file != '.') && ($file != '..')) { 
      if (is_dir($src . '/' . $file)) { 
       recurse_copy($src . '/' . $file,$dst . '/' . $file); 
      } 
      else { 
       copy($src . '/' . $file,$dst . '/' . $file); 
      } 
     } 
    } 
    closedir($dir); 
} 

// Copy all files to a new dir 
recurse_copy($source, $target); 

// Iterate through this dir, rename all files. 
$i = new RecursiveDirectoryIterator($target); 

foreach (new RecursiveIteratorIterator($i) as $filename => $file) {  
    @rename($filename, $target.'/'.$newnames[''.$i.'']);  
} 
?> 
+0

伟大的解决方案! – Ben

+0

谢谢你本:-) –

2

http://php.net/manual/en/function.rename.php

<?php 
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt"); 
?> 

编辑:在copy情况下 -

<?php 
$file = 'example.txt'; 
$newfile = 'example.txt.bak'; 

if (!copy($file, $newfile)) { 
    echo "failed to copy $file...\n"; 
} 
?> 
+0

他想保留原始文件。 '复制'文件而不是'重命名'。 – AlexStack

+0

我只需要在执行此操作之前手动复制目录... – Ben

+0

我没有尝试过,但它可能会自动创建目录! –

2

像这样的东西应该工作:

$source = '/files/folder'; 
$target = '/files/newFolder'; 
$newnames= array(
    "oldfilename" => "newfilename", 
    "oldfilename1" => "newfilename1", 
); 

// Copy all files to a new dir 
if (!copy($source, $target)) { 
    echo "failed to copy $source...\n"; 
} 

// Iterate through this dir, rename all files. 
$i = new RecursiveDirectoryIterator($target); 
foreach (new RecursiveIteratorIterator($i) as $filename => $file) { 
    rename($filename, $newnames[$filename]); 
    // You might need to use $file as first parameter, here. Haven't tested the code. 
} 

RecursiveDirectoryIterator文档。

+0

@cerbus比上面的答案更好吗? – Ben

+0

在我看来,很明显。至少,它更完整。 (其他答案只是从PHP文档中复制了2段代码) – Cerbrus

+0

am我正确地说,这种方法会重命名所有文件,而上面的答案只会一次性重命名一个文件? – Ben

1

这对于shell脚本来说很简单。从files.txt中提出的文件列表开始。

#!/bin/sh 
# Set the 'line' delimiter to a newline 
IFS=" 
" 

# Go through each line of files.txt and use it to call the copy command 
for line in `cat files.txt`; do 
    cp `echo $line | awk '{print $1;}'` `echo $line | awk '{print $2};'`; 
done