如何在PowerShell中循环遍历文件(完整路径)

5

如何在PowerShell中执行相同的操作?请注意,我需要每个文件的完整路径。

# ksh
for f in $(find /app/foo -type f -name "*.txt" -mtime +7); do
   mv ${f} ${f}.old
done

我尝试使用 Get-ChildItem 进行了一些操作,我确信答案就在那里。


你应该将你的发现转化为答案,这样它们就可以被点赞了。 - JaredPar
2个回答

6

我不确定mtime在这里的作用是什么,这里是完成其他所有操作的代码:

gci -re -in *.txt "some\path\to\search" | 
  ?{ -not $_.PSIsContainer } |
  %{ mv $_.FullName "$($_.FullName).old" }

mtime - 文件数据上次修改是n*24小时前。 - Ethan Post
1
?{ $_.LastWriteTime -le (Get-Date).AddDays(-8) } - ephemient
不确定如何在这里格式化注释,因此无法粘贴代码和输出。但是当我尝试原始答案时,我收到错误消息“Move-Item:不能将参数'Path'绑定到参数,因为它为空。”我正在使用PowerShell 1,也许这是个问题? - Ethan Post
@Ethan,抱歉我在格式化代码时错过了一个管道运算符,请再试一次。 - JaredPar
1
你不需要明确地将 $_.FullName 作为 Move-Item 的第一个参数,它也可以从 $_ 中推断出来。 - Joey
3
你可以进一步优化这个操作,因为 Move-Item 命令的 -destination 参数可以通过管道接收输入,所以你可以这样做:... | Move-Item -Dest {$_.FullName + '.old'} - Keith Hill

2

这似乎离我所需要的很近。我能够将Jared的答案中的一些信息与这个问题相结合,以找出解决方案。

foreach($f in $(gci -re -in hoot.txt "C:\temp")) {
   mv $f.FullName "$($f.FullName).old"
}

为了分享知识,这里提供一个用于模拟*nix find的函数。

function unix-find (
   $path,
   $name="*.*",
   $mtime=0) 
   {
   gci -recurse -include "$name" "$path" | 
      where-object { -not $_.PSIsContainer -and ($_.LastWriteTime -le (Get-Date).AddDays(-$mtime)) } |
      foreach { $_.FullName }
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接