Tengo archivos anidados en varias subcarpetas. Quiero mover estos archivos, una carpeta hacia arriba en la estructura de carpetas y cambiar el nombre de los archivos según su nueva carpeta principal. Necesitaré que esto se automatice con un script.
La carpeta de archivos adjuntos puede tener uno o varios archivos de .png
o .jpg
. Por ejemplo, la carpeta Adjuntos podría tener Apple.png
y Dog-house.jpg
. Si estos archivos se mueven y se les cambia el nombre, espero que el nombre del archivo sea algo como esto MCP##-##### - abc.png
y MCP##-##### - abc.jpg
.
Si hay más de un archivo con el mismo tipo de archivo, entonces el nombre será algo como esto MCP##-##### - abc.png
yMCP##-##### - abc (1).png
Supongo que esto puede requerir la automatización con un script, pero no tengo idea de cómo hacerlo. ¿Alguien puede ayudarme?
El siguiente es un ejemplo de flujo de trabajo de Automator que logra el objetivo declarado de su pregunta según su estructura de carpetas jerárquica definida.
NOTA: Si bien el código de ejemplo utilizado en la acción Ejecutar script de shell se completó correctamente, el usuario tiene la responsabilidad de asegurarse de que existan las copias de seguridad adecuadas antes de usarlo. Incluso sugeriría hacer una pequeña copia de muestra de la estructura de carpetas jerárquica de destino para probarla antes de ejecutar el flujo de trabajo en el destino original.bash
Con el fin de probar este flujo de trabajo , se creó la siguiente estructura jerárquica de carpetas con sus archivos:
$ tree ./Applications
./Applications
├── MCP19-00633 - Sport and Play at Br
│ └── Attachments
│ ├── barfoo.png
│ ├── filename.jpg
│ ├── filename.png
│ └── foobar.jpg
├── MCP19-00753 - Active Nabiac
│ └── Attachments
│ ├── barfoo.png
│ ├── filename.jpg
│ ├── filename.png
│ └── foobar.jpg
└── MCP19-00824 - A Family Friendly Ve
└── Attachments
├── barfoo.jpg
├── barfoo.png
├── filename.jpg
├── filename.png
├── foobar.jpg
├── namefile.jpg
└── namefile.png
6 directories, 15 files
$
Los resultados del flujo de trabajo de Automator se ejecutan en el objetivo anterior:
$ tree ./Applications
./Applications
├── MCP19-00633 - Sport and Play at Br
│ ├── MCP19-00633 - Sport and Play at Br (1).jpg
│ ├── MCP19-00633 - Sport and Play at Br (1).png
│ ├── MCP19-00633 - Sport and Play at Br.jpg
│ └── MCP19-00633 - Sport and Play at Br.png
├── MCP19-00753 - Active Nabiac
│ ├── MCP19-00753 - Active Nabiac (1).jpg
│ ├── MCP19-00753 - Active Nabiac (1).png
│ ├── MCP19-00753 - Active Nabiac.jpg
│ └── MCP19-00753 - Active Nabiac.png
└── MCP19-00824 - A Family Friendly Ve
├── MCP19-00824 - A Family Friendly Ve (1).jpg
├── MCP19-00824 - A Family Friendly Ve (1).png
├── MCP19-00824 - A Family Friendly Ve (2).jpg
├── MCP19-00824 - A Family Friendly Ve (2).png
├── MCP19-00824 - A Family Friendly Ve (3).jpg
├── MCP19-00824 - A Family Friendly Ve.jpg
└── MCP19-00824 - A Family Friendly Ve.png
3 directories, 15 files
$
La siguiente imagen del flujo de trabajo de ejemplo de Automator contiene las acciones utilizadas y sus configuraciones particulares utilizadas desde sus valores predeterminados. Asegúrese de hacer coincidir la configuración que se muestra en la imagen. En particular, la acción Obtener contenido de la carpeta tiene marcada la opción [√] Repetir para cada subcarpeta encontrada , y la acción Ejecutar script de Shell tiene Entrada de paso: establecida como argumentos .
bash
Código de ejemplo :
for f in "$@"; do
[[ -f $f ]] || continue
ext="${f##*.}"
move_to_dir="$(dirname "$(dirname "$f")")"
filename="$(basename "$move_to_dir")"
cd "$move_to_dir" || exit
if [[ ! -e ${filename}.${ext} ]]; then
mv "$f" "${filename}.${ext}"
else
n=1
for i in "${filename}" *".${ext}"; do
if [[ "${filename} (${n}).${ext}" == "$i" ]]; then
n=$(( n + 1 ))
fi
done
mv "$f" "${filename} (${n}).${ext}"
fi
done
for d in "$@"; do
[[ -d $d ]] || continue
[[ $(basename "$d") == Attachments ]] || continue
rmdir "$d"
done
Nota: El código de ejemplo es solo eso y solo contiene un manejo mínimo de errores, y se verificó mediante ShellCheck . Sin embargo, es posible que no contenga todo el manejo de errores deseado/necesario apropiado. El usuario tiene la responsabilidad de agregar cualquier manejo de errores que sea apropiado, necesario o deseado.bash
usuario3439894
../Applications/MCP##-##### - abc.../Attachments/
y solo hay un archivo JPEG en cada carpeta de Adjuntos y solo una carpeta de Adjuntos en lasMCP##-##### - abc...
carpetas, por ejemplo?Andrés C. Duarte
Attachments
carpeta podría contener uno o varios archivos y los tipos de archivo podrían ser.jpeg
o.png
usuario3439894
Andrés C. Duarte
Attachments
carpeta podría tenerApple.png
yDog-house.jpeg
. Si estos archivos se mueven y se les cambia el nombre, espero que el nombre del archivo sea algo como estoMCP##-##### - abc.png
yMCP##-##### - abc.jpeg
. Si hay más de un archivo con el mismo tipo de archivo, entonces el nombre será algo como estoMCP##-##### - abc.png
yMCP##-##### - abc (1).png
.usuario3439894
Andrés C. Duarte
CJK
Andrés C. Duarte
usuario3439894
rmdir
no eliminará un directorio que no esté vacío y la verificación agregada fue innecesaria. Habría sido necesario si hubiera usado, por ejemplo ,rm -rf "$d"
vs.rmdir "$d"
Lo siento si causó alguna confusión.