迭代文件夹并将文件向上移动一级

时间:2016-02-22 13:24:49

标签: macos bash shell

我有一个如下所示的目录结构:

/images
  /1
    /.tmp
      image1.jpg
      image2.jpg
  /2
    .tmp
      image1.jpg
      image2.jpg
      image3.jpg
  /3
    .tmp
      image1.jpg
      image2.jpg

我需要的是将.tmp中的所有文件上移一级,因此它们的路径为images/1/image1.jpg而不是images/1/.tmp/image1.jpg。问题是我有数百或数千个这些编号的文件夹,所以手工完成它将需要永远。

是否有OS X或Unix shell命令,我可以遍历每个/.tmp文件夹并将内容移动到某个级别,或类似:

mv images/*/.tmp/* images/< the current dir being iterated over>/*

2 个答案:

答案 0 :(得分:3)

如果您的find支持-execdir命令(OSX's find apparently does),那么您可以这样做:

find . -iname '*.jpg' -execdir mv {} .. \;

-execdir从找到该文件的目录运行该命令,因此..将引用该文件的目录的父目录。

您可以对此进行优化以强制匹配.tmp目录:

find . -path '*/.tmp/*.jpg' -execdir mv {} .. \;

但是,*中的-path也与/匹配,因此这也会匹配,例如images/.tmp/foo/image.jpg

你可以这样做:

find . -type d -name .tmp -print0 | xargs -0I_ find _ -maxdepth 1 -name '*.jpg' -execdir mv {} .. \;

或者,使用find的正则表达式支持:

find . -regex '.*/\.tmp/[^/]*\.jpg' -execdir mv {} .. \;

答案 1 :(得分:0)

从头开始,未经测试:

let list :NSArray = [
    GameInfo(gameStatus: "*", country: "Italy", isSelected: true),
    GameInfo(gameStatus: "1/2/21", country: "France", isSelected: true),
    GameInfo(gameStatus: "1-0", country: "UK", isSelected: true),
    GameInfo(gameStatus: "*", country: "Germany", isSelected: false),
    GameInfo(gameStatus: "0-1", country: "Italy", isSelected: true),
    GameInfo(gameStatus: "1/2-1/2", country: "UK", isSelected: false)
]

let isSelectedDescriptor: NSSortDescriptor = NSSortDescriptor(key: "isSelected", ascending: false)
let gameStatusDescriptor: NSSortDescriptor = NSSortDescriptor(key: "gameStatus", ascending: true)
let countryDescriptor: NSSortDescriptor = NSSortDescriptor(key: "country", ascending: true)


let sortedResults: NSArray = list.sortedArrayUsingDescriptors([isSelectedDescriptor,gameStatusDescriptor,countryDescriptor])

dump(sortedResults)