Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux在目录之前重命名文件_Linux_Rename_File Rename - Fatal编程技术网

Linux在目录之前重命名文件

Linux在目录之前重命名文件,linux,rename,file-rename,Linux,Rename,File Rename,我有以下命令,可以运行到小写文件/目录,replace。使用u和各种其他操作。它的问题是,它似乎试图先重命名目录,然后却找不到下面的文件。有没有一种方法可以先重命名目录中的所有文件,然后再递归地重命名目录本身?e、 g 目录1 文件1 文件2 目录1 文件1 文件2 目录2 文件1 目录2 文件1 文件2 我的代码是 while IFS= read -rd '' entry; do entry="${entry#./}" # strip ./ if

我有以下命令,可以运行到小写文件/目录,replace。使用u和各种其他操作。它的问题是,它似乎试图先重命名目录,然后却找不到下面的文件。有没有一种方法可以先重命名目录中的所有文件,然后再递归地重命名目录本身?e、 g

  • 目录1
    • 文件1
    • 文件2
    • 目录1
      • 文件1
      • 文件2
    • 目录2
      • 文件1
  • 目录2
    • 文件1
    • 文件2
我的代码是

while IFS= read -rd '' entry; do
   entry="${entry#./}"         # strip ./
   if [[ -d $entry ]]; then
      rename  'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   else
      rename  'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g;  s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   fi
done < <(find . -iname '*' -print0)
而IFS=read-rd''条目;做
entry=“${entry#./}”#条带/
如果[-d$分录]];然后
重命名为“y/A-Z/A-Z/;s//ug/g;s/-/-/g;s/sometext//g;s/_extras/-extras/g“$entry”
其他的
重命名为“y/A-Z/A-Z/;s/\.(?=.*\.)/\uG;s//ug/g;s/-/-/g;s/sometext//g;s/_extras/-extras/g“$entry”
fi

完成<以下是使用递归的未测试代码示例:

recurse()
{
for entry in "$1"/*; do
   entry="${entry#./}"         # strip ./
   if [[ -d $entry ]]; then
      recurse $entry
      rename  'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   else
      rename  'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g;  s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   fi
done
}

recurse "/home"

下面是使用递归的未测试代码示例:

recurse()
{
for entry in "$1"/*; do
   entry="${entry#./}"         # strip ./
   if [[ -d $entry ]]; then
      recurse $entry
      rename  'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   else
      rename  'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g;  s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   fi
done
}

recurse "/home"
你看过吗 您的场景更复杂,但看起来他们在处理递归方面遇到了同样的困难。

您看过吗
您的场景更为复杂,但看起来他们在处理递归方面遇到了同样的困难。

我在思考以下问题:

find /path |awk -F/ '{print NF,$0}' |sort -r -n -k 1 |cut -f2- -d' ' |\
  while IFS= read -rd '' entry; do
    # ...
  done
其思想是在每一行前面加上
/
的编号,并根据此字段反向排序:

4/path/dir1/file1
4/path/dir2/file2
3/路径/dir1
3/路径/dir2
2/路径


然后切掉第一列。通过这种方式,您可以自下而上处理条目,以避免重命名问题。

我一直在思考以下问题:

find /path |awk -F/ '{print NF,$0}' |sort -r -n -k 1 |cut -f2- -d' ' |\
  while IFS= read -rd '' entry; do
    # ...
  done
其思想是在每一行前面加上
/
的编号,并根据此字段反向排序:

4/path/dir1/file1
4/path/dir2/file2
3/路径/dir1
3/路径/dir2
2/路径


然后切掉第一列。通过这种方式,您可以自下而上处理条目,以避免重命名问题。

您需要使用递归在一次操作中实现这一点,或者先重命名文件,然后目录我将使用
find
创建一个列表,并根据目录/文件深度对其进行自下而上排序。您需要使用递归在一次操作中实现这一点,或者仅重命名文件首先,目录我将使用
find
创建一个列表,并根据目录/文件深度自下而上进行排序。这看起来应该可以工作,但当我尝试处理文件/目录时,我会收到一个错误,说“Filename too long:”。我可能会补充说,我正在使用bash for Windows(Ubuntu)并在NTFS磁盘上运行该命令,如果这与它来自何处有任何不同,请重命名?是的,我认为是这样,因为如果我运行该命令,它工作得很好|awk-F/'{print NF,$0}'| sort-r-n-k1 | cut-f2--d''| \entry=“${entry#./}”#strip./if[-d$entry];然后echo$entry else echo$entry fi done您可以使用
dirname
basename
拆分条目,如
dirname=$(dirname“$entry”)
,然后
pushd“$dirname”;重命名$rules“$basename”;popd
。这看起来应该可以工作,但当我尝试处理文件/目录时,会出现一个错误,显示“文件名太长:”。我可能会补充说,我正在使用bash for Windows(Ubuntu)并在NTFS磁盘上运行该命令,如果这与它来自何处有任何不同,请重命名?是的,我认为是这样,因为如果我运行该命令,它工作得很好|awk-F/'{print NF,$0}'| sort-r-n-k1 | cut-f2--d''| \entry=“${entry#./}”#strip./if[-d$entry];然后echo$entry else echo$entry fi done您可以使用
dirname
basename
拆分条目,如
dirname=$(dirname“$entry”)
,然后
pushd“$dirname”;重命名$rules“$basename”;popd