使用文件夹中存在的文件名创建文件夹,然后将这些文件移动到每个文件夹中

Create folders with names of files present in folder then move those files in each of that folder

我在 abc 文件夹中有不同的文件(每个文件的扩展名不同),我想根据该文件夹中存在的文件名创建文件夹,并将这些文件移动到相应的文件夹中。 例如:

文件夹 abc

2.0261fc5a.js.1
22b8a.0cb8dc71bas.map
318a.fa1253sdfde99265.js.map.1
s3ds.asdasg.asfgsf.afasdf.sd

具有唯一名称的文件。

我要创作

2.0261fc5a.js.1 文件夹并将 2.0261fc5a.js.1 文件移动到该文件夹 同样,这应该发生在所有文件上。 我做了一些研究并找到了这个解决方案。

tmp=`mktemp -d tmp_XXXXXX` || exit 1
for i in *
do
  mv "$i" $tmp
done
mv $tmp/* .
rm -r $tmp

但这给出了错误 mv: cannot move 'tmp_RwK2xZ' to a subdirectory of itself, 'tmp_RwK2xZ/tmp_RwK2xZ'

你们能帮忙解决一下吗?

我会使用 tmp file 而不是 tmp dir

tmpfile=$(mktemp)   # TODO, check this exists on the same filesystem,
                    # or provide a template argument
for file in *; do
  if [[ $file != "$tmpfile" ]]; then
    mv "$file" "$tmpfile"
    mkdir "$file"         # TODO check for failure
    mv "$tmpfile" "$file/$file"
  fi
done

剩下的事情:错误消息和 re-renaming 文件,如果出现问题。

您可以使用 find 也许:

find . -type f -maxdepth 1 -exec mv {} {}_temp \; -exec mkdir {} \; -execdir mv {}_temp {}/{} \;

基本上这个命令对名为 abc:

的文件做了什么
mv ./abc ./abc_temp
mkdir ./abc
mv ./abc_temp ./abc/./abc

通过添加 _temp 重命名文件,创建一个与原始文件同名的目录,最后将临时文件重命名回该目录。

对于当前目录中的每个元素fname

  • 如果该元素是一个文件:if [ -f $fname ]
  • 暂时将文件移动到/tmpmv $fname /tmp
  • 创建与fname同名的目录:mkdir $fname
  • fname 移动到该目录中:mv /tmp/$fname ./$fname/
for fname in *
do
    if [ -f "$fname" ]
    then
        mv "$fname" /tmp
        mkdir "$fname"
        mv "/tmp/$fname" "./$fname/"
    fi
done

为什么到处都是双引号?

空间,空间,空间。有时文件名有空格。这使得 problems。双引号是解决方案。

什么是/tmp

我们将文件从当前目录移动到临时目录,这样它就不会与我们即将创建的同名文件夹冲突。我们不必创建新文件或文件夹来存储任何内容,因为 linux /tmp 的存在正是为了这个目的。临时存储随机的东西:)