我在如下位置有大量文件:
C:/Users/(Username)/Desktop/(Parent-Collection name)/(filename1)/(filename1).ext
.../(filename2)/(filename2).ext
.../(filename3)/(filename3).ext
我正在尝试将.ext
文件批量移动到父文件夹,因此:
C:/Users/(Username)/Desktop/(Parent-Collection name)/(filename1).ext
本质上消除了对子文件夹的需要,就像从学校活页夹中取出分隔符一样。
答案1
你可能必须这样做赛格威,我向所有(仍然??)运行 M$ Windoze 间谍软件的人推荐它。
类似这样的操作应该可以工作。在目录中执行它C:/Users/(Username)/Desktop/(Parent-Collection name)/
(在 cygwin 中将被称为/cygdrive/c/Users/(Username)/Desktop/(Parent-Collection name)/)
:
for i in `find . -name "*" -type f`;
do mv $i `echo $i | sed 's/.*\/\([^/]*\)/\1/'`;
done
这会将下面所有目录中的所有文件移动到(Parent-Collection name)
。(Parent-Collection name)
具体来说,这是一个do
循环,索引循环i
遍历从当前目录向下的每个文件。这就是find
命令列出的内容。您可以通过运行 来查找语法。然后您执行的操作是将该文件man find
( ) 移动到新位置。该新位置由原始文件名 ( ) 指定,该文件名通过流编辑器 ( ,您可以使用 查找) 运行,该编辑器设置为剥离路径,保留基本文件名。mv
$i
echo $i
sed
man sed
我建议对其进行测试(创建一个目录,其中包含几个包含一些空文本文件或某些内容的子目录)并确保进行备份!
然后您可能想要删除当前目录下的所有(现在为空的)目录:
for i in `find . -name "*" -type d`;
do rmdir $i;
done
这里唯一不同的是,您要find
查找目录(-type d
)而不是文件(-type f
),然后删除这些目录(rmdir
,这仅适用于空目录)。
Linux 不是很酷吗?Cygwin 为您提供了 Linux 的一些功能,这可能是让您足够熟悉 Linux 的第一步,也许有一天您甚至会发现自己可以转向像 Ubuntu 这样的系统。:)
答案2
虽然我们不知道您使用的是哪个版本的 Windows,但这可以通过 Powershell 来完成。
$sourcefolder = "C:\Users\username\Desktop\ParentCollectionName"
$allfiles = Get-ChildItem -Recurse $sourcefolder | Where-Object {$_.PSIScontainer -eq $false}
ForEach ($file in $allfiles)
{
$destinationfolder = Split-Path -Parent $file.Directory.FullName
Move-Item $file.FullName $destinationfolder
}
子目录中的所有文件$sourcefolder
都将移动到该ParrentCollectionName
文件夹。然后您可以删除空的子文件夹。