【问题标题】:How to copy all PDF files from a directory and its subdirectories to one location?如何将目录及其子目录中的所有 PDF 文件复制到一个位置?
【发布时间】:2021-02-20 08:11:52
【问题描述】:

如何将目录及其子目录中的所有PDF 文件复制到单个目录?

实际上还有更多的文件,而且深度有些随意。假设四个目录的最大深度是公平的。

我想文件需要重命名,例如a.pdf 位于多个目录中。因为我将adding 将文件发送给Calibre,所以重复文件优于遗漏文件。 (不希望相互检查文件是否有重复。)

遵循 KISS 原则:

PS /home/nicholas/to> 
PS /home/nicholas/to> Copy-Item -path "/home/nicholas/from" -include "*.pdf" -Destination "/home/nicholas/to"
PS /home/nicholas/to> 
PS /home/nicholas/to> ls /home/nicholas/to
PS /home/nicholas/to> 
PS /home/nicholas/to> ls /home/nicholas/from
one  two
PS /home/nicholas/to> 
PS /home/nicholas/to> tree /home/nicholas/from
/home/nicholas/from
├── one
│   ├── a.pdf
│   ├── b.pdf
│   └── foo.txt
└── two
    ├── bar.txt
    ├── c.pdf
    └── d.pdf

2 directories, 6 files
PS /home/nicholas/to> 

显然,上述尝试未能遍历到子目录,并且不处理名称冲突。

在复制每个 PDF 时重命名它可能是有意义的。 recurse 标志似乎很有用:

PS /home/nicholas/to> 
PS /home/nicholas/to> ls
PS /home/nicholas/to> 
PS /home/nicholas/to> Copy-Item -Path "/home/nicholas/from" -Destination "/home/nicholas/to" -Recurse
PS /home/nicholas/to> 
PS /home/nicholas/to> tree
.
└── from
    ├── one
    │   ├── a.pdf
    │   ├── b.pdf
    │   └── foo.txt
    └── two
        ├── bar.txt
        ├── c.pdf
        └── d.pdf

3 directories, 6 files
PS /home/nicholas/to> 

不过,不确定如何过滤掉 txt 文件并将所有内容放到一个目录中。

复制所有PDF 文件,some 成功:

PS /home/nicholas/to> 
PS /home/nicholas/to> ls
PS /home/nicholas/to> 
PS /home/nicholas/to> tree /home/nicholas/from/                                                                                  
/home/nicholas/from/
├── one
│   ├── a.pdf
│   ├── b.pdf
│   └── foo.txt
└── two
    ├── bar.txt
    ├── c.pdf
    └── d.pdf

2 directories, 6 files
PS /home/nicholas/to> 
PS /home/nicholas/to> Get-ChildItem /home/nicholas/from -File -Recurse | Copy-Item -Destination /home/nicholas/to -filter '*.pdf'
PS /home/nicholas/to> 
PS /home/nicholas/to> tree
.
├── a.pdf
├── bar.txt
├── b.pdf
├── c.pdf
├── d.pdf
└── foo.txt

0 directories, 6 files
PS /home/nicholas/to> 

但是如何添加一些逻辑来重命名和增加具有1.pdf2.pdf 等模式的文件?

希望将带有 PDF 的文件夹“合并”到 single 目录。

【问题讨论】:

  • 你可以用我的Copy-Unique function 来做这个
  • @Theo,这真的很有用!如果可以的话,我会抢走那个脚本

标签: linux powershell file pdf copy


【解决方案1】:

您大部分时间都在正确的轨道上:

$PDFs = "C:\"
$i = 1

Get-ChildItem -Path $PDFs -Filter "*.pdf" -Recurse | ForEach-Object -Process {
    Copy-Item $_.FullName -Destination "C:\NewFileDir" -Verbose}
        
Start-Sleep 3

Get-ChildItem -Path C:\NewFileDir -File "*.pdf" -Recurse | ForEach-Object -Process {
    Rename-Item $_.FullName -NewName $("$_{0}.pdf" -f $i++) -Verbose}

【讨论】:

  • 当同名文件已复制到目标文件夹时,这将导致名称冲突。之后重命名将无济于事..
  • @Theo,那有什么更好的方法呢?提前改名?我建议复制唯一的,但文件名相同,而不是内容。
  • 除非我们先重命名唯一的,然后复制过来?反之亦然。
  • 编辑:见@Theos,函数。 stackoverflow.com/questions/65014451/…>
  • 我将这些添加到calibre,因此使用calibre 清除重复项。宁愿重复也不愿错过文件。至少在这种情况下。修剪文件似乎是一个单独的过程。
【解决方案2】:

大部分都有效:

nicholas@mordor:~/powershell/files$ 
nicholas@mordor:~/powershell/files$ pwsh copy_pdfs.ps1 
Copy-Item: /home/nicholas/powershell/files/copy_pdfs.ps1:9
Line |
   9 |      Copy-Item -path $pdf -Destination /home/nicholas/to/$i.pdf
     |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot retrieve the dynamic parameters for the cmdlet. The specified wildcard character pattern is not valid: The
     | possible origins of 2019-nCoV coronavirus [DOI 10.13140@RG.22.21799.29601] [originsof2019-n

Copy-Item: /home/nicholas/powershell/files/copy_pdfs.ps1:9
Line |
   9 |      Copy-Item -path $pdf -Destination /home/nicholas/to/$i.pdf
     |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot retrieve the dynamic parameters for the cmdlet. The specified wildcard character pattern is not valid: The
     | possible origins of 2019-nCoV coronavirus [DOI 10.13140@RG.22.21799.29601] [originsof2019-n

done
nicholas@mordor:~/powershell/files$ 
nicholas@mordor:~/powershell/files$ cat copy_pdfs.ps1 





$file = Get-ChildItem /home/nicholas/pdfs -filter *.pdf -recurse 
$i = 1                           
foreach ($pdf in $file) {            
    Copy-Item -path $pdf -Destination /home/nicholas/to/$i.pdf
    $i++              
}

$file = Get-ChildItem -filter *.pdf -recurse 




write-host "done"
nicholas@mordor:~/powershell/files$ 

感谢批评或替代解决方案。感谢 IRC 上的 weq 提供的逻辑。

【讨论】:

  • 您可以使用Copy-Item 进行过滤。 Copy-Item -Path $pdf -Filter "*.pdf" -Destination \\-\-\-
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 2014-03-08
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多