它一定是一个很普遍的问题,但我找不到答案。
如何通过*将所有文件(包括隐藏文件)移动到父目录,如下所示:
mv /path/subfolder/* /path/
这会将所有文件移到预期的父目录中,但不会移动隐藏文件。怎么做?
它一定是一个很普遍的问题,但我找不到答案。
如何通过*将所有文件(包括隐藏文件)移动到父目录,如下所示:
mv /path/subfolder/* /path/
这会将所有文件移到预期的父目录中,但不会移动隐藏文件。怎么做?
Answers:
您可以在UNIX和Linux关于如何将所有文件(包括隐藏文件)从一个目录移动到另一个目录的答案中找到一套全面的解决方案。。它显示了Bash,zsh,ksh93,标准(POSIX)sh等解决方案。
您可以同时使用这两个命令:
mv /path/subfolder/* /path/ # your current approach
mv /path/subfolder/.* /path/ # this one for hidden files
或一起(感谢pfnuesel):
mv /path/subfolder/{.,}* /path/
扩展为:
mv /path/subfolder/* /path/subfolder/.* /path/
(示例:echo a{.,}b
扩展为a.b ab
)
请注意,这将显示一些警告:
mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory
只需忽略它们即可:这是因为/path/subfolder/{.,}*
还会扩展到/path/subfolder/.
和/path/subfolder/..
,它们是目录和父目录(请参阅“。”和“ ..”在文件夹中的含义是什么?)。
如果您只想复制,则可以使用:
cp -r /path/subfolder/. /path/
# ^
# note the dot!
这将复制所有文件,包括普通文件和隐藏文件,因为/path/subfolder/.
扩展到“此目录中的所有内容”(来源:如何使用cp复制以包括隐藏文件和隐藏目录及其内容?)
mv /path/subfolder/* /path/subfolder/.* /path/
,并不是将两个命令组合为一个的严格要求。
mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
.
表示当前目录,..
表示up
目录。您必须已经注意到所有其他文件都已移动。
我认为这是最优雅的,因为它也不会尝试移动..
:
mv /source/path/{.[!.],}* /destination/path
..anything
或...anything
等文件。- stackoverflow.com/a/31438355/2351568包含用于此问题的正确正则表达式。|| 但是无论如何,使用shopt -s dotglob
仍然是更好的解决方案!
{a,b}*
会找到所有以a或b开头的文件,例如“ anatomy”和“ bulldozer”。第二个匹配项只是一个空匹配项,等效于*
,而第一个匹配项则等效于.[!.]
,其中组[!.]
表示的组不是以开头的.
。这意味着.*
但不是..*
。
这会将所有文件移到预期的父目录中,但不会移动隐藏文件。怎么做?
您可以打开dotglob
:
shopt -s dotglob # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
要关闭dotglob
,您需要说:
shopt -u dotglob
man shopt
不起作用,而且help shopt
非常简短。但是您可以这样做bashman () { man bash | less -p "^ $1 "; }
,然后bashman shopt
直接阅读所有内容。(如我所发现的,如果有行以shopt开头,则可能必须按n键才能跳到该命令。)
ls
..因此可能不是您想要的,这可能是
另一种更简单的解决方案是使用rsync
实用程序:
sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/
注意:以上命令将显示要更改的内容。要执行实际更改,请删除--dry-run
。
优点是原始文件夹(subfolder
)以及命令的一部分也将被删除,并且在mv
此处使用示例时,您仍然需要清理文件夹,更不用说将单个文件包含隐藏和非隐藏文件的麻烦了。模式。
此外rsync
,它还提供了在遥控器之间复制/移动文件的支持,并且可以确保复制的文件与原始文件(-a
)完全一样。
使用的-u
参数将跳过现有的较新文件,-r
递归到目录中,并-v
会增加详细程度。
sudo
和--dry-run
,因此人们可以在运行实际命令之前测试所做的更改,以避免任何潜在的混乱。
让我向您介绍我的朋友“ dotglob”。无论“ *”是否包含隐藏文件,它都会打开和关闭。
$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. .. .den .hi .hidden a b c
$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c
$ shopt -s dotglob
$ ls *
.den .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c
默认为“关闭”。
$ shopt dotglob
dotglob off
最好在完成后将其重新打开,否则您会以为将其关闭会感到困惑。
通过将find
命令与命令结合使用mv
,可以防止mv
命令尝试移动目录(例如..
和.
)和子目录。这是一个选择:
find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;
提供的其他一些答案有问题。例如,以下每个操作都将尝试从源路径移动子目录:
1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/
3) mv /source/path/{.[!.],}* /destination/path
此外,2)包括。和..文件,以及3)丢失了..foobar,... barfoo等文件。
您可以使用,mv /source/path/{.[!.],..?,}* /destination/path
其中将包含3)遗漏的文件,但仍会尝试移动子目录。如上文所述,将该find
命令与命令配合使用可mv
消除所有这些问题。
当我必须将所有文件(包括.
文件)复制到保留权限的目标目录时,针对此问题的解决方案是:(如果已存在,则覆盖)
yes | cp -rvp /source/directory /destination/directory/
yes
用于自动覆盖目标文件,
r
递归,
v
详细,
p
保留权限。
请注意,源路径不是以结尾/
(因此,所有文件/目录和。文件都被复制了)
/
当我们将源文件夹的内容放置到整个目标位置时,目标目录以结尾。
yes
如果要覆盖目标文件,虽然使用了一个很棒的命令,但这并不总是需要的。仅在确定要执行此操作时才使用它。另外,yes | cp ...
和之间有区别cp -f ...
吗?
cp -r /path/to/source/. /destination